2016-09-27 2 views
3

Насколько я знаю, это похоже на шаблон наблюдателя. Сценарий: Объект Center сохраняет список (очередь) всех своих клиентов. Я использую Twisted.как вызвать функцию в другом объекте при изменении переменной. Python

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

Возможно определить свойство [setter/getter] (http://stackoverflow.com/a/2627034/6779606). – PyNoob

ответ

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__ функция будет вызываться.

+0

Я использую Twisted, и кажется, что я не могу использовать класс нового стиля. Могу ли я использовать это? – Henry

+0

Это часть основного Python. Вы можете использовать его с любым вкусом Python. Сделал редактирование с образцом кода –

+0

, вы сказали: «Эта функция' __settattr__' будет вызвана ». но '__setattr__' будет вызван кем? – Henry

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

Я предполагаю, что va setter вызывается первым клиентом, не так ли? Так ли это решить проблему, что первый клиент будет удален до возвращения этого вызова сеттера? – Henry

+0

Сетчатель вызывается сразу после 'self.center.va = 1', до выхода' client.change', поэтому он запускается до того, как клиент уйдет. – chepner

+0

Что делать, если клиент должен уйти до того, как цепочка вызовов вернется? – Henry

Смежные вопросы