ある種のデータストアのように機能するPythonクラスを作成しようとしています。したがって、たとえば辞書を使用する代わりに、class.fooとしてデータにアクセスし、dataclassのxの場合と同様に、データを反復処理するなど、すべての優れた処理を実行できるようにします。
以下は私が思いついたものです:
class MyStore(object):
def __init__(self, data):
self._data = {}
for d in data:
# Just for the sake of example
self._data[d] = d.upper()
def __iter__(self):
return self._data.values().__iter__()
def __len__(self):
return len(self._data)
def __contains__(self, name):
return name in self._data
def __getitem__(self, name):
return self._data[name]
def __getattr__(self, name):
return self._data[name]
store = MyStore(['foo', 'bar', 'spam', 'eggs'])
print "Store items:", [item for item in store]
print "Number of items:", len(store)
print "Get item:", store['foo']
print "Get attribute:", store.foo
print "'foo' is in store:", 'foo' in store
そして、どうやらそれは動作します。やったー!しかし、属性の設定を正しく実装するにはどうすればよいですか?以下を追加すると、再帰制限が発生し__getattr__
ます。
def __setattr__(self, name, value):
self._data[name] = value
ドキュメントを読んで、再帰を避けるためにスーパークラス(オブジェクト)__setattr__
メソッドを呼び出す必要がありますが、そうすると、self._datadictを制御できなくなります。
誰かが私を正しい方向に向けることができますか?