2016-09-27 6 views
3

私が知る限り、これはObserverパターンのようなものです。 シナリオ: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.enter.va = 1'の直後に' client.change'が出る前に呼び出されるので、クライアントがなくなる前に実行されます。 – chepner

+0

クライアントがこの呼び出し連鎖の戻り中または終了前に退出する必要がある場合はどうなりますか? – Henry

関連する問題