变量更改后如何触发另一个对象中的函数。蟒蛇

Hen*_*nry 4 python

据我所知,这就像一个观察者模式。场景:一个Center对象保留其所有客户端的列表(队列)。我正在使用Twisted。

  1. 客户端对象之一更改中心对象中的变量,或通知中心更改该变量,
  2. 然后中心对象立即检测到更改
  3. 然后,一旦检测到,中心对象就会调用队列中下一个对象的某些功能
  4. 客户端更改变量后,删除客户端对象中心将处理下一个客户对象。因此,我想这些对象之间没有任何功能链。因此,它与观察者模式有些不同。(如何解决此问题?如果我写错了,请纠正我。)

以下代码仅用于演示:

    class client():
        def change(self):
            self.center.va = 1

        def inqueue(self):
            self.center.queue.enqueue(self)

        def function(self):
            pass

    class center():
        def __init__(self):
            self.queue = None
            self.va = 0

        ####  When the self.va changes, this func will be invoked
        def whenChanged(self):
            next = self.queue.dequeue()
            next.function()
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

va一个财产。

class Center():
    def __init__(self):
        self.queue = None
        self._va = 0

    @property
    def va(self):
        return self._va

    @va.setter
    def va(self, value):
        self._va = value
        self.whenChanged()

    def whenChanged(self):
        next = self.queue.dequeue()
        next.function()
Run Code Online (Sandbox Code Playgroud)


Moi*_*dri 5

每当类的属性发生更改时,setattr()都会调用函数。您可以通过__setattr__(self, property, value)在类中定义函数来覆盖它。

您需要在 this 中进行所需的函数调用__ setattr__()。以下是基于您的要求的示例示例:

class Centre(object):
    def __init__(self):
        self.queue = None
        self.va = 0

    def whenChanged(self):
        next = self.queue.dequeue()
        next.function()

    def __setattr__(self, key, value):
        self.key = value
        self.whenChanged()  # <-- Your function
Run Code Online (Sandbox Code Playgroud)

每当您尝试更改任何类属性的值时,__settattr__都会调用此函数。