我对python中的内部类使用有疑问。我知道这是一种不好的做法,但无论如何。我想知道内部类被定义的范围。我收到错误'全局名称'ClassName'未定义'。我的代码片段如下所示:
我发现为避免出现此错误,我可以使用:
ClassWithEnum.EnumClass
而不是:
EnumClass
答案 0 :(得分:4)
class ClassWithEnum(object):
class EnumClass(object):
...
def doSomethingWithEnum(self, m = EnumClass....):
...
Python类构造作为代码执行。 def
语句实际上是一行代码,用于创建函数。 class
关键字引入了命名空间。将这两种机制放在一起,就意味着class EnumClass
确实在当前命名空间中通过该名称创建了一个对象,与foo = 'bar'
所做的没有太大区别,所以在同一命名空间中你可以通过它来引用它name,这是def
语句中的内容。
同样比较:
class Foo:
bar = 'baz'
print bar
baz = bar
class
块中的每行代码都是常规的可执行代码行。
完成class
定义后,您将离开ClassWithEnum
命名空间,无法再使用该名称访问EnumClass
;它现在仅作为ClassWithEnum.EnumClass
提供;是否来自" outside"类或函数内的任何函数(包括类方法)。
要访问该类而不从您可以执行的方法中键入其名称:
type(self).EnumClass
或者只是self.EnumClass
,因为属性会被链抬起来。
答案 1 :(得分:2)
当您在doSomethingWithEnum
函数内时,您处于不同的命名空间中。要访问您班级中定义的任何内容,例如EnumClass
,您应该拨打self.EnumClass
。如果是类方法,则为cls.EnumClass
。