Если вы понимаете замыкания, единственная хитрость здесь в том, что локальная переменная, которую вы захватываете в замыкании, это параметр self
внутри getaudiocallback
.
Внутри этого метода self
- это, конечно, AudioEngine
экземпляр a
. Итак, значение перехваченной вами переменной - это тот же экземпляр.
Фактически, Python позволяет вам размышлять практически обо всем во время выполнения, так что вы можете увидеть это непосредственно:
>>> f = a.getaudiocallback()
>>> f
<function __main__.AudioEngine.getaudiocallback.<locals>.audiocallback(in_data, frame_count, time_info, status)>
>>> f.__closure__[0].cell_contents
<__main__.AudioEngine at 0x11772b3c8>
>>> f.__closure__[0].cell_contents is a
True
Если бы getaudiocallback
был все еще действующим, и он восстановился бы self
к некоторому другому значению, это f.__closure__[0]
обновилось бы, чтобы указать на новое значение self
. Так как это уже вышло, этого никогда не случится; ячейка всегда будет указывать на экземпляр, который был в a
во время вызова метода.
Но если этот экземпляр позже видоизменится, как, например, когда вы пишете a.liverecording = True
, вы, конечно, можете это увидеть.