当属性为dict类型时,@ property可写

时间:2015-07-06 10:06:50

标签: python dictionary properties setter

@property定义为int

以下代码取自Python Docs

class Parrot(object):
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

当我跑步时:

parrot = Parrot()
print(parrot.voltage)
parrot.voltage = 100
print(parrot.voltage)

我得到以下输出(正如预期的那样,因为没有定义 setter

{0: 100000}
Traceback (most recent call last):
   File "prop.py", line 13, in <module>
     parrot.voltage = 100
 AttributeError: can't set attribute

@property定义为dict

但是,如果我定义self._voltage = {} 属性变得可写

class Parrot(object):
    def __init__(self):
        self._voltage = {}
        self._voltage[0] = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

parrot = Parrot()
print(parrot.voltage)
parrot.voltage[0] = 100
print(parrot.voltage)

然后输出:

{0: 100000}
{0: 100}

Python 2.7.9和Python 3.4.3中的相同行为。即使代码中没有明确定义 setter ,为什么属性可写? Here建议将dict子类化以获得此行为。但是,似乎这不是必需的。

1 个答案:

答案 0 :(得分:2)

您没有设置该属性。你正在操纵一个可变对象。

分配不在属性本身上,但在订阅上,[..]部分解决了字典密钥。您可以将属性分配给新名称并仍然操作该字典:

parrot = Parrot()
parrot_voltage = parrot.voltage
parrot_voltage[0] = 100

但您无法将属性设置为新字典或完全不同类型的对象。这适用于属性中使用的所有可变对象;列表,集合,实例等。