我不完全确定这是针对stackoverflow的,所以如果不是,请纠正我。
即说我们有 t.py 内容:
class A(object):
pass
print("A:", A)
class B(object):
print("From B: A:", A)
class OuterClass(object):
class AA(object):
pass
print("AA:", AA)
class BB(object):
print("From BB: AA:", AA)
现在我们执行它:$ python3 t.py
A: <class '__main__.A'>
From B: A: <class '__main__.A'>
AA: <class '__main__.AA'>
From BB: AA:
Traceback (most recent call last):
File "t.py", line 9, in <module>
class OuterClass(object):
File "t.py", line 14, in OuterClass
class BB(object):
File "t.py", line 15, in BB
print "From BB: AA:", AA
NameError: name 'AA' is not defined
从文档:
类定义是一个可执行语句。它首先评估继承列表(如果存在)。继承列表中的每个项目都应评估为允许子类化的类对象或类类型。然后使用新创建的本地名称空间和原始的全局名称空间在新的执行框架中执行该类的套件(请参阅命名和绑定部分)。(通常,套件只包含函数定义。)当类的套件完成执行时,它的执行帧被丢弃,但它的本地命名空间被保存。[4] 然后使用基类的继承列表和属性字典的保存的本地名称空间创建一个类对象。类名绑定到原始本地命名空间中的此类对象。
所以我理解这种行为,但不理解使范围不像其他地方那样具有词汇性的理由。这违背了“特殊情况不足以打破规则”。为什么class
行为不同于,说,def
?
这是一个“实用胜于纯粹”的案例吗?如果是这样,理由是什么?我最初认为它可能是 python 2.x 的产物,但正如您在上面看到的,这种行为也存在于 python 3.3 中。