内部类使用python。未定义全局名称

时间:2017-06-16 11:10:51

标签: python

我对python中的内部类使用有疑问。我知道这是一种不好的做法,但无论如何。我想知道内部类被定义的范围。我收到错误'全局名称'ClassName'未定义'。我的代码片段如下所示: enter image description here

我发现为避免出现此错误,我可以使用:

ClassWithEnum.EnumClass

而不是:

EnumClass
doSomethingWithEnum()函数内部。所以我想知道是否还有其他方法可以在doSomethingWithEnum()函数中定义EnumClass?当我在DoSomethingWithEnum()函数中将EnumClass声明为默认参数时,为什么没有这样的错误?

2 个答案:

答案 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