我认为Python中的class
语句会创建一个范围。但是尝试这个简单的代码我得到一个错误:
class A():
foo = 1
def __init__(self):
print foo
a = A()
NameError: global name 'foo' is not defined
为什么foo
无法从初始化程序访问?访问它的正确方法是什么?
答案 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