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
对于嵌套类,是否有其他方法来执行此操作,或者我是否做错了什么
理想情况下,如果创建新实例,您希望使用classmethods,下面是一个示例:
或者,如果希望使用当前实例创建实例(例如,如果需要传入一些参数),则可以使用
type(self)
或self.__class__
获取类但是,在不了解您的用例的情况下,这可能不是您想要的
您的错误来自python处理类的方式
当遇到
class
语句时,将运行类的主体,并将其定义的名称放置在单独的命名空间中,该命名空间最终将成为类__dict__
。在主体运行之后,才创建类对象并将其绑定到其名称。这意味着,当您将class NestedClass:
放在class ExampleClass:
的主体中时,ExampleClass
还不存在,而且NestedClass
也不存在。间接地,由于这一点,所有新的类名称空间都位于顶级可用名称空间(例如,全局或函数)中,并且实际上并不嵌套在另一个名称空间中由于这种操作顺序,类主体根本不知道周围类的名称空间。因此
NestedClass
的名称空间关注的是全局名称空间,而不是ExampleClass
的__dict__
,正如您从Java中可能期望的那样。在函数中定义的类可以在全局函数之前看到函数的本地名称空间,但仍然不能看到封闭类的名称空间因此,行
newclass = NestedClass()
会引发一个错误。函数名称空间或全局名称空间中不存在名称NestedClass
。有三种简单的解决方法:使用静态范围的
__class__
:通过类的全局名称引用该类:
不要在Python中使用嵌套类。这通常是首选方法。只需将
NestedClass
移到顶层即可。然后您的makenew
方法将在不进行修改的情况下工作,并且ExampleClass.Example
可以直接引用NestedClass
,而不是作为self.NestedClass
引用相关问题 更多 >
编程相关推荐