【问题标题】:Inner class usage python. Global name is not defined内部类使用python。未定义全局名称
【发布时间】:2017-11-19 03:31:30
【问题描述】:

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

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

ClassWithEnum.EnumClass

代替:

EnumClass

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

【问题讨论】:

  • 请将您的代码作为代码发布,以便于复制。
  • @deceze,好的,以后会这样做。

标签: python


【解决方案1】:

当您在 doSomethingWithEnum 函数中时,您处于不同的命名空间中。要访问您的类中定义的任何内容,例如EnumClass,您应该调用self.EnumClass。如果是类方法,则为cls.EnumClass

【讨论】:

    【解决方案2】:
    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>

    【讨论】:

    • +1 以获得详细解释,当然还有这一行 Python class construction executes as code
    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 2013-08-23
    • 2013-11-12
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多