Skip to main content
 首页 » 编程设计

python之为什么一个类中的类不在另一个类中的类的范围内

2025年05月04日31kuangbin

考虑以下代码:

from enum import Enum 
 
class A(object): 
    class B(object): 
        blah = "foo" 
        derp = "bar" 
 
    class SubA(object): 
        def __init__(self):                                                                                                                                                                                                             
            self.value = B.derp 

这引发了一个 NameError

>>> A.SubA() 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "test.py", line 10, in __init__ 
    self.value = B.derp 
NameError: name 'B' is not defined 

另一方面,将 B.derp 替换为 A.B.derp 可使代码按预期工作。

为什么 Python 的作用域以它的方式解决这个问题,为什么 这在 Python 的设计中有意义?

请您参考如下方法:

如 PEP 227 中所述,类主体的作用域在嵌套在其中的其他作用域内不可用。因此,在您的示例中为 B 获得 NameError 的原因与在这种情况下获得 NameError 的原因相同:

class Foo(object): 
    x = 88 
    def foo(self): 
        print(x) 

在类主体中定义的函数(即方法)无权访问类主体范围;嵌套类(或嵌套在其中的函数)也不行。

A.B.derp 之所以有效,是因为 A 在全局范围内,它始终可以访问。

但是,请注意,如果您尝试在类主体中直接使用它,即使 A.B.derp 也不会工作:

class A(object): 
    class B(object): 
        derp = 88 
    class SubA(object): 
        stuff = A.B.derp 

这行不通,因为引用 A.B.derp 的行是在创建 A 的过程中执行的,所以 A 不会尚不存在,无法引用。