引用类体内的类属性

问题描述 投票:0回答:0

我有一个使用抽象类属性的 API,本质上是一个类的所有实例都存在的属性,并在类主体中定义。

我想以编程方式生成其中一些属性。它们不是 dynamic 因为它们在运行时不会改变。

例如,一个类 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眼里有什么区别?

编辑:这个问题 not “UnboundLocalError: local variable referenced before assignment”的副本 为什么在这种情况下不应用 LEGB 规则?

那个答案表明“您也可以在类定义期间直接在类级别访问它 [bax_template],但由于您仍在临时范围内,这只是本地访问 (LEGB) 的另一个示例。”这在我的测试用例中不起作用。我可以访问 bax_values,但不能访问 bax_template。我的问题是问这两个变量之间有什么区别,使一个变量可访问而另一个变量不可访问。好像跟理解变量的范围有关

编辑2: 为了证明这似乎与理解变量的范围有关,以下解决方法可以完成这项工作。

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)}

这意味着我们可以在理解的可迭代部分引用类属性,但不能在理解的值/定义部分引用

python python-3.x oop attributes
© www.soinside.com 2019 - 2024. All rights reserved.