class MyDict(dict):
def __setitem__(self, key, value):
if key == 'message':
super().__setitem__('message', '')
super().__setitem__('last_message', value)
else:
super().__setitem__(key, value)
class A(object):
def __init__(self):
self._b = MyDict({"message": "",
"last_message": ""})
@property
def b(self):
return self._b
a = A()
a.b['message'] = 'hello'
print(a.b['message'])
# ''
print(a.b['last_message'])
# hello
我认为你已经发现,你的二传手不工作的原因是
a.b['message']='hello'
首次访问
a.b
,它调用
b
属性的getter,而不是其setter。getter返回dict
self._b
. 然后
self._b['message']='hello'
导致口述
__setitem__
被称为。
为了解决这个问题,你需要一个特别的口述(比如
MyDict
)