如何在Python中从嵌套类中创建该类的实例?

2024-05-19 03:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

class ExampleClass():
    def Example(self):
        self.nestedinstance = self.NestedClass()
        self.nestedinstance.makenew()


    class NestedClass():
        def makenew(self):
            newclass = NestedClass()

ExampleClass().Example()

当我运行上面的代码时,我得到异常:name 'NestedClass' is not defined

对于嵌套类,是否有其他方法来执行此操作,或者我是否做错了什么


Tags: 方法代码nameselfisexampledefnot
2条回答

理想情况下,如果创建新实例,您希望使用classmethods,下面是一个示例:

class NestedClass():
    @classmethod
    def makenew(cls):
        newclass = cls()

或者,如果希望使用当前实例创建实例(例如,如果需要传入一些参数),则可以使用type(self)self.__class__获取类

class NestedClass():
    def makenew(self):
        newclass = type(self)()

但是,在不了解您的用例的情况下,这可能不是您想要的

您的错误来自python处理类的方式

当遇到class语句时,将运行类的主体,并将其定义的名称放置在单独的命名空间中,该命名空间最终将成为类__dict__。在主体运行之后,才创建类对象并将其绑定到其名称。这意味着,当您将class NestedClass:放在class ExampleClass:的主体中时,ExampleClass还不存在,而且NestedClass也不存在。间接地,由于这一点,所有新的类名称空间都位于顶级可用名称空间(例如,全局或函数)中,并且实际上并不嵌套在另一个名称空间中

由于这种操作顺序,类主体根本不知道周围类的名称空间。因此NestedClass的名称空间关注的是全局名称空间,而不是ExampleClass__dict__,正如您从Java中可能期望的那样。在函数中定义的类可以在全局函数之前看到函数的本地名称空间,但仍然不能看到封闭类的名称空间

因此,行newclass = NestedClass()会引发一个错误。函数名称空间或全局名称空间中不存在名称NestedClass。有三种简单的解决方法:

  1. 使用静态范围的__class__

    newclass = __class__()
    
  2. 通过类的全局名称引用该类:

    newclass = ExampleClass.NestedClass()
    
  3. 不要在Python中使用嵌套类。这通常是首选方法。只需将NestedClass移到顶层即可。然后您的makenew方法将在不进行修改的情况下工作,并且ExampleClass.Example可以直接引用NestedClass,而不是作为self.NestedClass引用

相关问题 更多 >

    热门问题