我以簡單的方式直接訪問它與d.key
符號值,而不是d['key']
擴展dict
:如何創建一個具有__getattr__適當選擇的類?
class ddict(dict):
def __getattr__(self, item):
return self[item]
def __setattr__(self, key, value):
self[key] = value
現在,當我嘗試醃製它,它會調用__getattr__
找到__getstate__
,這是沒有也不必要。同樣會發生在與__setstate__
取儲存:
>>> import pickle
>>> class ddict(dict):
... def __getattr__(self, item):
... return self[item]
... def __setattr__(self, key, value):
... self[key] = value
...
>>> pickle.dumps(ddict())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __getattr__
KeyError: '__getstate__'
如何不得不修改類ddict
爲了得到妥善揀選?
對不起,但這個答案中的一切都是錯誤的。 Pickle試圖訪問實例上的'__getstate__'方法,此時查詢'__getattr__'方法。這會嘗試在映射中通過該名稱訪問一個關鍵字,並且該關鍵字通過'KeyError'失敗;這不是屬性訪問破壞pickle的正常例外。 –
接下來,'dict'上沒有'__getattr__'方法,所以'super()'調用將失敗。該方法是可選的,只用作缺失屬性的回退鉤子。 –
接下來,截取'__setattr__'的全部重點是覆蓋正常的屬性賦值過程,而不是重定向到字典鍵賦值。調用'super()'版本會失敗這個目的。 –