オブジェクトは、自分自身の参照の一部またはすべてを他のものと置き換えることはできません。期間。しかし、あなたはポインタオブジェクトの辞書(実際のデータを返すために.get()
方法のいくつかのフォームを持っている)を持っている必要がありますならば、ちょうどからデータを取得するとき、あなたが適切なロジックを追加できるようになるdict
サブクラスの__getitem__
メソッドをオーバーライド
辞書:
class MyDict(dict):
def __getitem__(self,item):
value = dict.__getitem__(self,item) #may raise error
if isinstance(value, Myclass):
return value.get_val()
else:
return value
my_obj = Myclass()
data = MyDict({
'key_1': my_obj,
# other fields
})
assert data["key_1"] == 100
いますが、この変更のみとなるよう、より完全な実装がcollections.MutableMapping
で行うことができる変更__getitem__
を使用することはありません.items()
または.get()
などを使用して、ルックアップのいずれかの方法であって、
import collections
class MyDict(collections.MutableMapping):
__slots__ = ["raw_dict"]
def __init__(self,*args,**kw):
self.raw_dict = dict(*args,**kw)
def __getitem__(self,item):
value = self.raw_dict[item]
if isinstance(value, Myclass):
return value.get_val()
return value
def __setitem__(self,item, value):
self.raw_dict[item] = value
def __delitem__(self, item):
del self.raw_dict[item]
def __len__(self):
return len(self.raw_dict)
def __iter__(self):
return iter(self.raw_dict)
その後.get
と.pop
と.items
などのような他のすべてのメソッドは、すべてここに定義されたものから作成されます。元のポインタオブジェクトはまだdata.raw_dict["key_1"]
でアクセス可能なので、何も隠されている/失われたトラックはありません。
オブジェクトはそれ自身を行うことはできませんが、dictionaryのサブクラスは 'data [key]'ルックアップの処理方法をかなり簡単にオーバーライドできます。 –
既に述べたように、クラス内で特定の値を返すためにオーバーライドできる魔法のバリエーションがあります –
なぜこれを最初に行う必要がありますか? –