Car*_*ers 8 python getter setter dictionary properties
我正在尝试@property在类中的dict上使用Python的装饰器.我的想法是,我希望在访问后清除某个值(称之为"消息").但我还想要另一个值(称之为'last_message')来包含最后设置的消息,并保留它直到另一个消息被设置.在我看来,这段代码可行:
>>> class A(object):
... def __init__(self):
... self._b = {"message": "",
... "last_message": ""}
... @property
... def b(self):
... b = self._b
... self._b["message"] = ""
... return b
... @b.setter
... def b(self, value):
... self._b = value
... self._b["last_message"] = value["message"]
...
>>>
Run Code Online (Sandbox Code Playgroud)
但是,它似乎不是:
>>> a = A()
>>> a.b["message"] = "hello"
>>> a.b["message"]
''
>>> a.b["last_message"]
''
>>>
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么?在我看来似乎@property不像我期望的那样工作,但也许我在做其他根本错误的事情?
另外,我知道我可以在课堂上使用个别值.但这是作为Web应用程序中的会话实现的,我需要它作为一个词典.我可以使这个工作,或使整个会话对象假装它是一个字典,或使用单个变量,并在其余的代码库中将其破解为工作性.我宁愿让这个工作.
unu*_*tbu 13
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
Run Code Online (Sandbox Code Playgroud)
正如我认为你已经发现的那样,你的二传手不工作的原因是因为
a.b['message']='hello'
Run Code Online (Sandbox Code Playgroud)
第一次访问a.b,调用b属性的getter,而不是它的setter.getter返回dict self._b.然后self._b['message']='hello'导致dict __setitem__被调用.
所以要解决这个问题,你需要一个特殊的dict(比如MyDict).