带有“self”的Python侦听器方法

2024-05-15 23:47:32 发布

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

我能找到的所有监听器实现示例都使用不带self的监听器方法,如果您想在传递的监听器方法之外处理响应,这似乎没有帮助

以下是我正在尝试的:

class A:
    @property
    def command(self):
        return self._command

    @command.setter
    def command(self, command):
        self._command = command
        self._notify_command_observers(command)

    _command_callbacks = []
    def _notify_command_observers(self, command):
        for callback in self._command_callbacks:
            callback(command) #<-- TypeError: function takes 2 positional arguments but 1 were given

    def register_command_callback(self, callback):
        self._command_callbacks.append(callback)

    def receive_command(self, new_command):
        self.command = new_command #<-- an external process will provide this "new_command" variable
class B:
    def use_command(self, command):
        print(command)

    def command_listener(self, command):
        self.use_command(command)

    a = A()
    a.register_command_callback(command_listener)

这将导致上述注释中显示的错误

如果在_notify_command_observers内调用callback()时使用self,将传递错误的上下文,并且将找不到use_command()

当然,我可以删除command_listener()中的self,但是我需要访问class B实例中的其他方法和变量

TL;DR:如何将侦听器方法传递给类实例,并在该侦听器中包含传递的类的上下文

-------编辑--------

使用@jasonharper的建议,这是有效的:

class B:
    def __init__(self):
        self.a = A()
        self.a.register_command_callback(self.command_listener)

    def use_command(self, command):
        print(command)

    def command_listener(self, command):
        self.use_command(command)

Tags: 方法selfregisternewusedefcallbacknotify