Python类体中引用类属性的差异:为何部分属性无法访问?
类定义中字典推导式访问类属性的作用域差异问题
我有一个使用类级别属性的API,这类属性属于类的所有实例且定义在类体内部。我希望以编程方式生成其中部分属性,它们是非运行时动态变化的属性。
可行的基础示例
定义Foo类,通过列表键生成字典bax,以下代码可以正常运行:
class Foo: bax_values = [0,1,2,3] bax = {f"{x}":x+1 for x in bax_values}
复杂场景的报错问题
当场景包含模板与键集合时,代码运行失败:
class Foo: bax_values = [0,1,2,3] bax_template = "bar{s}" bax = {f"{x}":bax_template.format(s=x) for x in bax_values}
这段代码会提示bax_template未定义,但之前的示例却能正常访问bax_values,这两者的表现存在矛盾。
问题核心
请问在Python中,这两种情况的差异是什么?
编辑说明:本问题并非同类问题的重复。有回答提到“在类定义期间,可在类级别直接访问类属性,属于LEGB规则中的本地访问”,但我的测试场景中无法访问bax_template却能访问bax_values,我想知道这两个变量的差异导致此现象的原因,推测与推导式变量的作用域有关。
编辑补充:以下 workaround 验证了该推测,代码可正常运行:
from itertools import product class Foo(object): bax_values = [0,1,2,3] bax_template = ['bar{s}'] bax = {f"{key}":template.format(s=key) for key,template in product(bax_values, bax_template)}
这说明推导式的可迭代部分可引用类属性,而值定义部分则不可。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

