在 python 中,使用import
类中的语句来定义刚刚从其他模块窃取的类变量是有效的:
class CustomMath:
from math import pi
assert isinstance(CustomMath.pi, float) # passes
使用非常混乱的语句将全局变量引用到类也是有效的x=x
x = 1
class Test:
# this loads the global variable x and stores in in the class scope
x = x
assert Test.x == 1 # passes
但是,如果我使用函数来生成类,是否有类似的方法将变量从函数参数复制到类主体?
我想要这种性质的东西:
def generate_meta_options(model, design):
class Meta:
# copy the nonlocal variable model to this scope
# but this isn't valid syntax
model = (nonlocal model)
design = translate_old_design_spec_to_new_format((nonlocal design))
return Meta
参数名称很重要,因为它是通过关键字而不是顺序传递的,generate_meta_options(design="A", model=Operation)
并且类中的名称必须相同,我找到了一种解决方法,方法是为所有输入设置变量别名,但这有点烦人
def generate_meta_options_works(model, design):
_model = model
_design = design
class Meta:
model = _model
design = translate_old_design_spec_to_new_format(_design)
return Meta
有没有更好的方法使用nonlocal
关键字来实现这一点?似乎python确实允许nonlocal
并global
在一个类中使用,但变量没有保留在类中,所以我无法想象它的用例。
gl = 'this is defined globally'
def nonlocal_in_class_test():
lo = 'this is defined locally'
class Test:
nonlocal lo
global gl
lo = 'foo'
gl = 'bar'
assert lo == 'foo' # passes
assert gl == 'bar' # passes
assert hasattr(Test, 'lo') or hasattr(Test, 'gl'), 'lo nor gl was put in the class scope' # fails
我确定我正在使用的库只需要一个具有属性查找的对象,这样我就可以远离类,但是我看到的每个示例都使用类(我怀疑是因为继承多个配置是自然的)所以我很犹豫去那个路线。
从不同的模块复制变量比在上述范围内复制一个权利更容易,这似乎真的很奇怪,所以我想我会问,有没有办法将变量从nonlocal
范围复制到类属性中不创建具有不同名称的单独变量?
作为切线,在类主体中使用nonlocal
or关键字是否有用?global
我认为它没有用,但也没有理由做额外的工作来禁止它。