class 如何生成根据 class 属性更改的回调函数?
How can a class generate a callback function, that changes according to a class attribute?
我遇到这种情况:
module1.py
:
class AudioEngine:
def __init__(self):
self.liverecording = False
def getaudiocallback(self):
def audiocallback(in_data, frame_count, time_info, status): # these 4 parameters are requested by pyaudio
data = None # normally here we process the audio data
if self.liverecording:
print("Recording...")
return data
return audiocallback
main.py
:
import module1
a = module1.AudioEngine()
f = a.getaudiocallback()
f(0, 0, 0, 0)
a.liverecording = True
f(0, 0, 0, 0) # prints "Recording...", which is the expected behaviour, but why does it work?
问题:如何让回调函数audiocallback(...)
相应的改变为a.liverecording
的新值?如果开箱即用,为什么会这样?
更具体地说,f
是否在使用 f = a.getaudiocallback()
创建后,在他的代码 中保留指向 a.liverecording
的指针(因此如果后者被修改,这将被考虑在内),或 a.liverecording
值的副本(即 False
)在创建 f
?
如果您了解闭包,这里唯一的技巧是您在闭包中捕获的局部变量是 getaudiocallback
.
中的 self
参数
在该方法中,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
的时候,你当然可以看到。
我遇到这种情况:
module1.py
:
class AudioEngine:
def __init__(self):
self.liverecording = False
def getaudiocallback(self):
def audiocallback(in_data, frame_count, time_info, status): # these 4 parameters are requested by pyaudio
data = None # normally here we process the audio data
if self.liverecording:
print("Recording...")
return data
return audiocallback
main.py
:
import module1
a = module1.AudioEngine()
f = a.getaudiocallback()
f(0, 0, 0, 0)
a.liverecording = True
f(0, 0, 0, 0) # prints "Recording...", which is the expected behaviour, but why does it work?
问题:如何让回调函数audiocallback(...)
相应的改变为a.liverecording
的新值?如果开箱即用,为什么会这样?
更具体地说,f
是否在使用 f = a.getaudiocallback()
创建后,在他的代码 中保留指向 a.liverecording
的指针(因此如果后者被修改,这将被考虑在内),或 a.liverecording
值的副本(即 False
)在创建 f
?
如果您了解闭包,这里唯一的技巧是您在闭包中捕获的局部变量是 getaudiocallback
.
self
参数
在该方法中,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
的时候,你当然可以看到。