@属性 当属性为 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 中的行为相同。为什么 属性 是可写的,即使代码中没有明确定义 setter? Here 建议子类化 dict
以获得此行为。但是,这似乎不是必需的。
您没有设置 属性。您正在操纵一个可变对象。
赋值不在 属性 本身,而是在 订阅 上,[..]
部分寻址字典键。您可以将 属性 分配给一个新名称并仍然操纵该字典:
parrot = Parrot()
parrot_voltage = parrot.voltage
parrot_voltage[0] = 100
但您不能将 属性 设置为新词典或完全不同类型的对象。这适用于 属性 中使用的所有可变对象;列表、集合、实例等
@属性 定义为 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 中的行为相同。为什么 属性 是可写的,即使代码中没有明确定义 setter? Here 建议子类化 dict
以获得此行为。但是,这似乎不是必需的。
您没有设置 属性。您正在操纵一个可变对象。
赋值不在 属性 本身,而是在 订阅 上,[..]
部分寻址字典键。您可以将 属性 分配给一个新名称并仍然操纵该字典:
parrot = Parrot()
parrot_voltage = parrot.voltage
parrot_voltage[0] = 100
但您不能将 属性 设置为新词典或完全不同类型的对象。这适用于 属性 中使用的所有可变对象;列表、集合、实例等