ext
не является глобальным, он временно локальный когда класс создается. Из class
statement documentation:
люкс класса затем выполняется в новом кадре исполнения (см Naming and binding) с помощью вновь созданного локального пространства имен и исходные глобальное пространство имен. (Обычно набор содержит в основном определения функций.) Когда пакет класса завершает выполнение, его кадр выполнения отбрасывается, но его локальное пространство имен сохраняется.
Emphasis mine. Затем локальное пространство имен формирует атрибуты класса.
К тому времени, когда вы вызываете метод MP3File.play()
, это локальное пространство имен давно исчезло; вы не можете просто ссылаться на ext
, как будто он все еще существует. Теперь это атрибут класса!
Вы можете адресовать этот атрибут с помощью ссылки на экземпляр self
. Если экземпляр также не имеет атрибут ext
, атрибут класса найден и возвращен вместо:
def play(self):
print(self.ext)
или вы можете найти его на классе:
def play(self):
print(MP3File.ext)
Потому что это атрибут класса, использование ' self.ext'. – jonrsharpe