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

标签 python

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

我发现为了避免出现这个错误我可以使用:

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 ,因为属性是在链中查找的。

关于python - 内部类使用python。未定义全局名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44587820/

相关文章:

python - 如何在 Python 中使用 "write to variable"而不是 "to file"

python - 对 Vim 有用的 Python 命令列表?

python - 有效地累积稀疏 scipy 矩阵的集合

python - 如何通过python删除数据框列中两个特定单词之间的文本

python - 使用 Python 脚本发送附件

python - 使用 Python Egg/Wheel 打包共享对象(库)

python - 如果在 Python 中找到该行的一部分,则从文件中打印该行

python - 如何使用 OrdinalEncoder() 设置自定义顺序?

python - 如何找到神经网络的误报率和漏报率?

python - 从机翼坐标文件中读取和绘制坐标的最简单方法是什么?