1

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

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

a = A() 

NameError: global name 'foo' is not defined

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

4

1 回答 1

10

创建范围。这记录在pep 227中:

类范围内的名称不可访问。名称在最里面的封闭函数范围内解析。如果类定义出现在嵌套范围链中,则解析过程会跳过类定义。

并在class复合语句文档中:

然后使用新创建的本地名称空间和原始全局名称空间在新的执行框架中执行该类的套件(请参阅命名和绑定部分)。(通常,套件只包含函数定义。)当类的套件完成执行时,它的执行帧被丢弃,但它的本地命名空间被保存[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 
于 2013-06-07T09:35:18.523 回答