我对 python 中的内部类用法有疑问。我知道这是一种不好的做法,但无论如何。我想知道定义内部类的范围。我收到错误“未定义全局名称‘ClassName’”。我的代码片段如下所示:
我发现为了避免出现这个错误我可以使用:
ClassWithEnum.EnumClass
代替:
EnumClass
doSomethingWithEnum() 函数内部。所以我想知道是否有任何其他方法可以在 doSomethingWithEnum() 函数内部定义 EnumClass ?为什么我在 doSomethingWithEnum() 函数中将 EnumClass 声明为默认参数时没有出现这样的错误?
最佳答案
class ClassWithEnum(object):
class EnumClass(object):
...
def doSomethingWithEnum(self, m = EnumClass....):
...
Python 类构造作为代码执行。 def
语句实际上是正在执行的一行代码,它创建了一个函数。 class
关键字引入命名空间。将这两个机制放在一起,就意味着 class EnumClass
实际上在当前命名空间中用该名称创建了一个对象,与 foo = 'bar'
没有太大区别确实如此,因此在同一个命名空间中,您可以使用该名称引用它,这就是 def
中发生的情况声明。
同时比较:
class Foo:
bar = 'baz'
print bar
baz = bar
class
中的每一行代码块是常规的可执行代码行。
一旦你的class
定义完成,你就离开了ClassWithEnum
命名空间,无法访问 EnumClass
不再只是那个名字;现在只能作为 ClassWithEnum.EnumClass
使用;无论是来自类“外部”还是来自函数内部(任何函数,包括类方法)。
要在方法中不输入类名就可以访问该类,您可以这样做:
type(self).EnumClass
或者简单地 self.EnumClass
,因为属性是在链中查找的。p>
关于python - 内部类使用python。未定义全局名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44587820/