是一个在类"全局"中定义的变量。即在Python中无效

时间:2014-09-13 23:03:53

标签: python python-3.x nameerror

有人可以向我解释为什么,以下代码ext可以在MP3File类中找到,但不能在play方法中找到?对不起,这个简短的问题就是我需要知道的。

class MP3File(AudioFile):
    ext = 'mp3'
    print(ext)

    def play(self):
        print(ext) #NameError: global name 'ext' is not defined

1 个答案:

答案 0 :(得分:1)

ext不是全局的,在创建类时暂时是本地的。来自class statement documentation

  

然后在新的执行框架(参见Naming and binding),使用新创建的本地名称空间和原始全局名称空间执行类的套件。 (通常,套件主要包含函数定义。)当类的套件完成执行时,它的执行帧被丢弃,但它的本地名称空间被保存。

强调我的。然后,本地名称空间形成类属性。

当你的MP3File.play()方法被调用时,那个本地命名空间已经很久了;你不能只是引用ext,好像它仍然存在。它现在是一个类属性!

您可以通过self对实例的引用来处理该属性。除非实例具有ext属性,否则会找到并返回class属性:

def play(self):
    print(self.ext)

或者你可以在课堂上找到它:

def play(self):
    print(MP3File.ext)