小能豆

Python 嵌套类给出“未定义的名称”

py

我有一个带有两个嵌套类的主类:

class cls_1:

  class Enum_1(Enum):
     ...

  @dataclass
  class Nested:
     ...
     feature: Enum_1 #NameError: name 'Enum_1' is not defined

如您所见,我正在使用其中一个嵌套类作为另一个嵌套类的类型。但这会给出:NameError: name 'Enum_1' is not defined如代码中突出显示的那样。

我感觉我忽略了一些明显的东西,但不确定那是什么。


阅读 18

收藏
2024-12-09

共1个答案

小能豆

在 Python 中,嵌套类是类定义内部定义的类(类 A 内部的类 B)。如果你在嵌套类中访问外部类的成员或方法,或者在外部类中访问嵌套类,可能会遇到 “未定义的名称” 错误。通常这是因为类的作用域和访问权限导致的。

错误示例:

假设你写了如下代码,并且遇到了 NameError: name 'B' is not defined

class A:
    class B:
        def __init__(self):
            print("B initialized")

    def __init__(self):
        print("A initialized")
        self.b = B()  # Error: B is not defined

a = A()

错误原因:在 A__init__ 方法中直接访问 B 会导致 NameError,因为类 BA 的嵌套类,只有在访问时通过 A.B 来正确引用它。

正确写法:

你应该通过外部类名来引用嵌套类。下面是修正后的代码:

class A:
    class B:
        def __init__(self):
            print("B initialized")

    def __init__(self):
        print("A initialized")
        self.b = A.B()  # Correct: Referencing B as A.B

a = A()

解释:

  1. 嵌套类访问:类 B 定义在 A 内部,所以它应该通过 A.B 来访问。A.B() 创建了 B 的实例。
  2. 实例化 A 类时:当你实例化 A 时,self.b = A.B() 创建了 B 的实例并打印 "B initialized"

嵌套类实例访问:

如果你希望能够访问外部类的实例成员,可以通过传递外部类实例给嵌套类的构造函数来实现。例如:

class A:
    class B:
        def __init__(self, a_instance):
            self.a_instance = a_instance
            print("B initialized with A instance")

    def __init__(self):
        print("A initialized")
        self.b = A.B(self)  # Passing current A instance to B

a = A()

其他常见问题:

  • 外部类的实例方法访问嵌套类:如果你想让外部类的实例方法访问嵌套类,确保你通过正确的引用来访问。
class A:
    class B:
        def __init__(self):
            print("B initialized")

    def __init__(self):
        print("A initialized")
        self.b = A.B()  # Correct: Use A.B to access nested class

    def create_b(self):
        return A.B()  # Correct: You can also access it within instance methods

a = A()
a.create_b()

总结:

  • 嵌套类应该通过外部类名访问:嵌套类 B 应通过 A.B 来访问。
  • 在方法中引用嵌套类:要在 A 的方法中引用 B,你也应该通过 A.B 来引用它。

希望这能帮助你解决 “未定义的名称” 错误!如果还有其他问题,欢迎继续提问。

2024-12-09