类如何生成一个回调函数,该函数根据类属性而改变?

2024-10-02 16:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这种情况:

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

^{pr2}$

问题:如何使回调函数audiocallback(...)根据a.liverecording的新值进行相应的更改?如果开箱即用,那为什么呢?

更具体地说,一旦用f = a.getaudiocallback()创建f,在他的代码中是否保存一个指向a.liverecording的指针(因此,如果修改后者,将考虑后者),还是在创建{}时,a.liverecording(即False)值的副本?在


Tags: inpyselffalsedatareturninitdef
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:32

如果您理解闭包,这里唯一的技巧是在闭包中捕获的局部变量是self内的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反弹到其他值,则{}将更新为指向新的值{}。因为它已经退出,所以永远不会发生这种情况;在调用方法时,单元格将始终指向a中的实例。在

但是如果这个实例后来发生了变化,比如当您编写a.liverecording = True时,您当然可以看到这一点。在

相关问题 更多 >