如何在Python中初始化器中访问类变量?

时间:2013-06-07 09:33:33

标签: python scope python-2.x

我认为Python中的class语句会创建一个范围。但是尝试这个简单的代码我得到一个错误:

class A():
    foo = 1 
    def __init__(self):
        print foo 

a = A() 

NameError: global name 'foo' is not defined

为什么foo无法从初始化程序访问?访问它的正确方法是什么?

1 个答案:

答案 0 :(得分:10)

创建范围。这在pep 227

中有记录
  

无法访问类范围中的名称。名称已解决       最里面的封闭功能范围。如果是一个类定义       在嵌套范围链中发生,解析过程会跳过       类定义。

class compound statement documentation

  

然后使用新创建的本地命名空间和原始全局命名空间,在新的执行框架中执行类的套件(请参阅Naming and binding部分)。 (通常,套件仅包含函数定义。)当类的套件完成执行时,将丢弃其执行框架,但保存其本地名称空间[4]然后使用基类的继承列表和属性字典的已保存本地名称空间创建类对象。

强调我的;执行框架是临时范围。

要访问foo,请使用self.foo

class A():
    foo = 1 
    def __init__(self):
        print self.foo 

或按名称访问A类,或使用type(self)访问当前类(可能是子类):

def __init__(self):
    print A.foo 

def __init__(self):
    print type(self).foo