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

@property gets writeable when attribute is of dict type

@属性 定义为 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

@属性 定义为 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 中的行为相同。为什么 属性 是可写的,即使代码中没有明确定义 setterHere 建议子类化 dict 以获得此行为。但是,这似乎不是必需的。

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

赋值不在 属性 本身,而是在 订阅 上,[..] 部分寻址字典键。您可以将 属性 分配给一个新名称并仍然操纵该字典:

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

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