[英]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.