2016-04-06 15 views
0

ディクショナリへの参照を値が更新された後でもクラス属性の一部として設定するにはどうすればよいですか?dictをクラス属性として参照

live = {'APPL': {'bid': 41, 'ask': 43}} 
extras = {'name': 'apple', 'country': 'us', 'currency': 'usd'} 

class myClass: 
def __init__(self, live_data, extra_data): 
    self.__dict__ = live_data 
    self.__dict__.update(extra_data) 

def update(self, extra_data): 
    self.__dict__.update(extra_data) 


symbol = myClass(live['APPL'], extras) 

変数 'live'が更新された場合、すべて正常に機能します。
変数 'extras'が更新された場合、インスタンス属性はその参照を失います。

辞書データを更新中...

live['APPL']['bid'] = 40 
live['APPL'].update({'ask': 44}) 
extras['country'] = 'uk' 
extras.update({'currency': 'gbp'}) 

インスタンス '記号は、' 適切にを更新し続ける辞書に属性の参照を保持する方法

In: symbol.bid 
Out: 40 
In: symbol.ask 
Out: 44 
In: symbol.country 
Out: 'us' 
In: symbol.currency 
Out: 'usd' 

を更新しません。新しいデータが到着するとすぐに値が返されますか?

答えて

0

は、代わりにself.__dict__を変更するのではなく、__getattr__()メソッドを定義します。

class myClass: 
    def __init__(self, live_data, extra_data): 
     self._live = live_data 
     self._extra = extra_data 

    def __getattr__(self, name): 
     if name in self._extra: 
      return self._extra[name] 
     elif name in self._live: 
      return self._live[name] 
     else: 
      raise AttributeError("No attribute: {}".format(name) 
+0

それは完璧に働いたが、すべての呼び出しにこの方法を使用すると、周りに前作よりも大幅に遅くなりました。 '1ループあたり1.24μsと164ns /ループ 'このコードは1秒間に数回実行されるため、クラス属性がdict項目への参照を維持できるようにするアイデアや提案は歓迎します。 – user5404669

関連する問題