有人可以向我解释为什么,以下代码ext
可以在MP3File
类中找到,但不能在play
方法中找到?对不起,这个简短的问题就是我需要知道的。
class MP3File(AudioFile):
ext = 'mp3'
print(ext)
def play(self):
print(ext) #NameError: global name 'ext' is not defined
答案 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)