为什么不能从方法访问类变量?

2022-02-22 00:00:00 python namespaces scope

问题描述

考虑:

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

我希望a通过限定规则作用域对该方法可用:首先是本地,然后是封闭.

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

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

显然,我对名称空间和作用域感到困惑。我试着阅读了这方面的资料,但没有找到关于这一点的明确说明(当然,self.a是有效的)。


解决方案

类主体不是嵌套作用域,No。PythonExecution Model显式排除它:

在类挡路中定义的名称的范围仅限于类挡路;它不会扩展到方法的代码块

这是因为类的主体被执行以形成类属性;将其视为具有局部变量的函数,并且局部变量将成为新类对象的属性。

然后,您可以直接在类(Foo.a)上访问这些属性,也可以通过实例访问这些属性(其中属性查找通过类)。

相关文章