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
或 global
关键字是有用的呢?我认为它没有用,但也没有理由去做额外的工作来禁止它。
X
的类属性,但只有其中一个存在作用域冲突),这就是为什么我没有直接回答它的原因。 - ShadowRangerclass
语句的命名空间不是作用域行为并不是真正的问题。你也不能从同名的非局部变量的值初始化函数中的局部变量。 - chepnervar = globals()["var"]
对于全局变量(globals)也可以起作用。 - Tadhg McDonald-Jensen