簡體   English   中英

在字典上使用@property裝飾器

[英]Using @property decorator on dicts

我正在嘗試在類中的字典上使用Python的@property裝飾器。 我的想法是我希望在訪問某個值后將其清除(稱為“消息”)。 但是我還希望另一個值(稱為“ 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"]
...
>>>

但是,它似乎沒有:

>>> a = A()
>>> a.b["message"] = "hello"
>>> a.b["message"]
''
>>> a.b["last_message"]
''
>>>

我不確定自己做錯了什么? 在我看來, @property不能像我期望的那樣工作,但是也許我在做其他根本上錯誤的事情?

另外,我知道我可以在類中使用單個值。 但這是作為Web應用程序中的會話實現的,我需要將其作為命令。 我可以做這項工作,也可以使整個會話對象假裝成字典,或者使用單個變量將其遍歷整個代碼庫的其余部分。 我寧願只是讓它工作。

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'

首先訪問ab ,它調用b屬性的getter而不是其setter。 吸氣劑返回字典self._b 然后self._b['message']='hello'導致字典的__setitem__被調用。

因此,要解決此問題,您需要一個特殊的字典(例如MyDict )。

我可能會想念您在這里嘗試做的事情,但這是否可以解決您的問題?

class A(object):
    def __init__(self):
        self._b = {'message':'',
                   'last_message': ''}

    @property
    def b(self):
        b = self._b.copy()
        self._b['message'] = ''
        return b

    @b.setter
    def b(self, value):
        self._b['message'] = value
        self._b['last_message'] = value


if __name__ == "__main__":
    a = A()
    a.b = "hello"
    print a.b
    print a.b
    print a.b["last_message"]

$ python dictPropTest.py
{'last_message': 'hello', 'message': 'hello'}
{'last_message': 'hello', 'message': ''}
hello

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM