为什么类变量无法从方法中访问?

7

请考虑:

class Foo:
    a = 1
    def bar():
        print(a)

按照作用域规则,我期望在方法中可以使用变量a:首先查找本地作用域,然后是封闭作用域……

Foo创建了一个命名空间和作用域,不是吗?

bar创建了一个作用域;它不是被类的作用域所包含吗?在bar的作用域中没有定义变量a,因此我期望它从封闭作用域中获取类变量。

显然,我对命名空间和作用域感到困惑。我已经尝试阅读相关资料,但还没有找到关于这个特定问题的明确解释(当然,self.a是有效的)。


尝试使用 Foo.a 而不是 a - Simpom
2个回答

10
类体不是可嵌套作用域。Python 执行模型 明确将其排除在外:

在类块中定义的名称的作用域仅限于类块本身,不会扩展到方法的代码块中。

这是因为类的主体被执行以形成类属性;可以将其看作带有局部变量的函数,而这些局部变量则成为新类对象的属性。
然后,您可以通过类本身 (Foo.a) 或实例 (其中属性查找通过类) 访问这些属性。

-1
class Foo:
    def __init__(self):
        self.a = 1

    def bar(self):
        print(self.a)

通过使用__init__(),您将能够将变量传递给其他函数。

2
这不是OP所询问的内容。问题在于为什么类作用域中的名称不能像嵌套函数作用域中那样在方法中访问。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接