對象不能用其他東西替換任何/所有的自身引用。期。
不過,如果你需要有指針對象的字典(有某種形式的.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
雖然注意,這僅是改變查找一個方法,使用.items()
或.get()
等將不使用修改後的__getitem__
這樣一個更完整的實現可以用collections.MutableMapping
來完成:
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"]
訪問,所以沒有任何東西被隱藏/丟失。
該對象本身不能這樣做,儘管字典的子類可以覆蓋它很容易處理'data [key]'查找的方式。 –
如前所述,您可以在班級中重複使用各種魔術方法返回特定值 – 2016-07-26 07:37:50
爲什麼您需要首先執行此操作? –