是在类中定义的变量;“全球”;i、 e.在Python中无效

是在类中定义的变量;“全球”;i、 e.在Python中无效,python,python-3.x,nameerror,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 ext不是全局的,在创建类时它暂时是本地的。从: 然后,使用新创建的本地命

有人能解释一下为什么在下面的代码中,
ext
可以在
MP3File
类中访问,但不能在其
play
方法中访问?很抱歉提这么短的问题,我只想知道这些

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

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

ext
不是全局的,在创建类时它暂时是本地的。从:

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

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

当调用
MP3File.play()
方法时,本地名称空间早已消失;您不能仅仅引用
ext
,就好像它仍然存在一样。它现在是一个类属性

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

def play(self):
    print(self.ext)
或者你可以在课堂上找到它:

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

因为它是一个类属性,所以使用
self.ext
“它的执行框架被丢弃,但它的本地名称空间被保存。”对我来说,这听起来像是该变量将被完全删除。我说得对吗(奇怪的是,对我来说)实际发生的事情是,它从一个“临时局部变量”转换为一个类属性,而不需要任何类型的赋值?@Startec:在执行框架中创建的局部名称被用作类对象上的属性。任务已经完成;这只是使用将本地名称空间转换为字典的问题;e、 g.将本地名称作为键枚举,并将其值作为字典中的关联值。@Startec:如果您想了解有关该过程的更多信息,请阅读