我以简单的方式直接访问它与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()'版本会失败这个目的。 –