2014-09-13 2 views
0

Может кто-нибудь объяснить мне, почему в следующем коде ext доступен в классе MP3File, но не в его методе play? Извините за короткий вопрос, вот и все, что мне нужно знать.Является ли переменная определенной в классе «глобальная», то есть недействительной в Python

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

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

Потому что это атрибут класса, использование ' self.ext'. – jonrsharpe

ответ

1

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) 
+0

** «его кадр выполнения отбрасывается, но его локальное пространство имен сохраняется». ** Для меня это звучит так, будто переменная будет полностью удалена. Я прав, что то, что на самом деле происходит (как ни странно, для меня), заключается в том, что он преобразуется из «временной локальной переменной» в атрибут класса без какого-либо назначения? – Startec

+0

@Startec: локальные имена, созданные в кадре выполнения, используются как атрибуты объекта класса. Назначение уже выполнено; это просто вопрос использования преобразования локального пространства имен в словарь; например перечислите локальные имена в качестве ключей и их значения как соответствующие значения в словаре. –

+0

@Startec: если вы хотите узнать больше об этом процессе, прочитайте [Что такое метакласс в Python?] (Http://stackoverflow.com/q/100003) –

 Смежные вопросы

  • Нет связанных вопросов^_^