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

时间:2016-09-27 16:39:21

标签: python

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

  1. 客户端对象之一更改中心对象中的变量或通知中心更改变量
  2. 然后中心对象立即检测到更改;
  3. 然后一旦检测到,中心对象就会在队列中调用下一个对象的一些功能
  4. 客户端更改变量后,客户端对象将被消除。 中心将负责下一个客户端对象。所以我想这些对象之间没有任何功能链。所以它与观察者模式略有不同。 (如何解决这个问题?如果我错了,请纠正我。)
  5. 以下代码仅用于演示:

        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()
    

2 个答案:

答案 0 :(得分:4)

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()

答案 1 :(得分:2)

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

您需要在此__ 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

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