簡體   English   中英

從全局變量導入的類填充屬性

[英]Imported class populating properties from global variables

我有一個要在運行時填充的類屬性,但是我不想傳遞該值。 我現在正在做的是:

weird_class.py

class WeirdClass:
    prop = NotImplementedError

runtime_file.py

from weird_class import WeirdClass
PROP = 'somevalue'

class WeirdClassChild(WeirdClass):
    prop = PROP

WeirdClassChild ,但是無論何時創建WeirdClassChild ,我都必須設置prop值,這很WeirdClassChild

我想要的是WeirdClassChild自動選擇PROP全局變量,而無需我特別告知。

我想做類似的事情:

class WeirdClass:
    prop = __global_namespace__.PROP

這可能在python中嗎?

您可以使用inspect離子來確定實例化您的類的上下文:

# class definition
import inspect
class Weird:
    def __init__(self):
        caller_frame = inspect.stack()[1]
        caller_module = caller_frame[0]
        self.prop = caller_module.f_globals['PROP']

# instantiation
PROP = 555
x = Weird()
print(x.prop)
=> 555

我不一定會推薦它,但是如果您有充分的理由這樣做...

您也許可以使用元類:

#!/usr/bin/env python3

PROP = "only for subclasses"


class _WierdMeta(type):
    # Not sure if you should use __init__ or __new__
    # Use one or the other.

    # `cls` is an instance of the class type that _WierdMeta creates
    def __init__(cls, name, bases, dct):
        if bases:
            cls.prop = PROP
        super().__init__(name, bases, dct)

    # `cls` is _WierdMeta  
    def __new__(cls, name, bases, dct):
        class_type = super().__new__(cls, name, bases, dct)
        if bases:
            class_type.prop = PROP
        # this return value will be the `cls` passed to __init__ above
        return class_type

class WierdBase(metaclass=_WierdMeta):
    """Base class."""
    prop = "base"


class WierdChild(WierdBase):
    pass


wb = WierdBase()
wc = WierdChild()
print(wb.prop)  # print('base') 
print(wc.prop)  # print('only for subclasses')

看來從Python 3.6開始,您可以使用__init_subclass__做到這__init_subclass__

class WierdBase():
    """Base class."""
    prop = "base"

    # I'm not 100% on the args here...
    def __init_subclass__(cls, **kwargs):
        # ... or here.
        super().__init_subclass__(**kwargs)
        if cls is not WierdBase:
            cls.prop = PROP

根據您最后的用法說明,為什么不添加另一個基類?

from weird_class import WeirdClass
PROP = 'somevalue'

class WeirdClassChildBase(WeirdClass):
    prop = PROP

class WeirdClassChild_1(WeirdClassChildBase):
    pass

class WeirdClassChild_2(WeirdClassChildBase):
    pass

...

我將其分為三個文件,並按照此處說明的方法進行操作: https : //instructobit.com/tutorial/108/How-to-share-global-variables-between-files-in-Python

  • globals.py在這里初始化PROP的值
  • weird_class.py在這里您應該導入globals.py並使用PROP值
  • start.py在這里您可以測試奇怪的類,但是在導入其模塊之前,您應該導入globals.py並調用一些初始化方法

globals.py文件將匯總所有全局默認值。 假設首先在start.py腳本中,您應該導入全局變量並對其進行初始化。

    import globals
    globals.initialize()
    from weird_class import WeirdClass

    c = WeirdClass()
    print(c.prop)

在您的weird_class文件中,您可以從globals.py訪問該變量,前提是您已導入該變量:

    import globals
    class WeirdClass:
        prop = globals.PROP

最后, globals.py看起來像:

    def initialize():
        global PROP
        PROP = "my global value"

這里的關鍵部分是在設置初始值之前聲明global PROP global關鍵字將在模塊globals中使變量成為global

將全局變量,常量和所有魔術值放在模塊范圍內的單個中央位置通常是一個優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM