- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
或 global
关键字有用的情况?我认为它没有用,但也没有理由做额外的工作来禁止它。
最佳答案
nonlocal
在任何情况下都不起作用,因为在 nonlocal
适用的情况下变量只有一个作用域(函数局部变量,与类定义作用域略有不同);通过尝试使用 nonlocal
,您会说 model
从来没有是类定义范围的一部分,只是它之外的东西。
我个人更喜欢你的有点怪异的重新分配,所以类外的 _model
和类内的 model
不会冲突,但如果你不喜欢它,可以选择直接访问正在进行的类的命名空间,vars()
(或 locals()
;在这种情况下,两者是等价的,但我不认为 将类范围视为本地人,即使他们的行为很像)。
因为范围不是真正的函数范围,实际上您可以通过 vars
/locals 的
,让您想要的结果看起来像:dict
改变它
def generate_meta_options(model, design):
class Meta:
vars().update(
model=model,
design=translate_old_design_spec_to_new_format(design)
)
return Meta
使用 dict.update
的关键字参数传递形式意味着代码甚至看起来大多像正常赋值。如果您随后在类定义中更早(查看外部范围)或稍后(查看新定义的名称)使用这些名称,Python 不会提示:
def generate_meta_options(model, design):
print("Before class, in function:", model, design) # Sees arguments
class Meta:
print("Inside class, before redefinition:", model, design) # Sees arguments
vars().update(
model=model,
design=design+1
)
print("Inside class, after redefinition:", model, design) # Sees class attrs
print("After class, in function:", model, design) # Sees arguments
return Meta
MyMeta = generate_meta_options('a', 1)
print(MyMeta.model, MyMeta.design)
关于python - 在类体内使用非局部或全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69814086/
因此,我的flutter应用程序运行正常,但是我想对其进行一些更改。 我要执行的第一个更改是创建一个水平滚动窗口小部件,该窗口小部件的图像可以单击以更改工作站。 但是要做到这一点,我首先需要将两个小部
如何在 Bootstrap 模态的主体内设置 div 样式?这是我的模型: text ') .okBtn('ok') .open();">Open Model 我的CSS: @M
我有一个简单的触发器,它在 SQL Fiddle 上运行,但它不允许我将 INSERT STATEMENT 移动到触发器的主体内。 my code on sqlFiddle我只是想移动这条线 INSE
我是一名优秀的程序员,十分优秀!