2016-11-08 3 views
0

私は現在、watchable dictをGUI https://github.com/jackburridge/pywatchで使用できるようにライブラリを作成していますが、AngularJSのようにWatchableオブジェクト(Angulars case $ scope)でwatchable dictを作成する最良の方法

(角内のオブジェクト)他の辞書のように扱われる私は現在、このようななんとか見ディクショナリ構造を持っている:

class Watcher: 
def __init__(self, watch_object, item): 
    self.watch_object = watch_object 
    self.item = item 
    self.listeners = [] 

def bind(self, callback): 
    self.listeners.append(callback) 

def notify(self): 
    for listener in self.listeners: 
     try: 
      listener() 
     except Exception as e: 
      logging.error(traceback.format_exc()) 

def get_value(self): 
    return self.watch_object[self.item] 

def set_value(self, value): 
    self.watch_object[self.item] = value 


class WatchableDict(dict): 
    def __init__(self, seq=None, **kwargs): 
     self.watchers = {} 
     dict.__init__(self) 

    def __setitem__(self, item, new_value): 
     new_b = item in self 
     old_value = self[item] if item in self else None 
     dict.__setitem__(self, item, new_value) 
     if new_b: 
      if old_value != new_value: 
       self.watchers[item].notify() 
     else: 
      self.watchers[item] = Watcher(self, item) 

    def get_watcher(self, name): 
     if name in self.watchers: 
      return self.watchers[name] 
     return None 

その後、誰かがget_watcherメソッドを使用して、それを見るために辞書から値を取得することができます。これは現在うまくいきますが、ネストされた辞書やリストのような追加機能を追加した方が良いかどうか疑問に思っています。

答えて

0

私はしばらく前にこれらの行に沿って何かしようとしました。 https://github.com/petrblahos/modellerkit、特にstep07で見ることができます。私の考えは、コンテナ内に不変の値のみを許可することでした(私はdictを使用せず、クラスをコンテナとして使用しました)。誰かがcontainer_object.watched_property = "new value"を呼び出すと、これはwatched_propertyのセットメソッドによって検出され、リスナーに通知されます。

だから私は本当に私が

my_model.operation_list.append(Operation(10, 2123, datetime.datetime.now()) 

と呼ばれ、私のリストビューが自動的に項目にラベルが同様にカウント、更新される。状況になってしまいました

私はあなたが単にリポジトリを複製し、例を実行してその動作を確認することができると信じています。私はそれをプロジェクトや2でも使っています。でも、私はこのアプローチがJavaの方がPythonにうまく合うと感じています。

関連する問題