python - 为啥只读属性是可写的?
Posted
技术标签:
【中文标题】python - 为啥只读属性是可写的?【英文标题】:python - why is read-only property writable?python - 为什么只读属性是可写的? 【发布时间】:2013-03-05 17:08:54 【问题描述】:我正在尝试在 Python 中定义一个具有只读属性的类;我按照 Python 文档编写了以下代码:
#!/usr/bin/python
class Test:
def __init__(self, init_str):
self._prop = init_str
@property
def prop(self):
return self._prop
t = Test("Init")
print t.prop
t.prop = "Re-Init"
print t.prop
现在,当我尝试执行代码时,虽然我预计会出现错误/异常,但我看到它正在正常执行:
$ ./python_prop_test
Init
Re-Init
我的 Python 版本是 2.7.2。我所看到的,是预期的吗?如何确保属性不可设置?
【问题讨论】:
【参考方案1】:要按您的预期工作,Test
需要是一个新样式的类:
class Test(object):
^^^^^^^^
documentation for property()
中暗示了这一点:
为新式类(派生自
object
的类)返回一个属性属性。
当我将Test
转换为新样式类,并尝试更改prop
时,出现异常:
In [28]: t.prop='Re-Init'
AttributeError: can't set attribute
【讨论】:
旧式类不优先考虑property
数据描述符;它可以让你隐藏实例字典中的属性。【参考方案2】:
要使用属性,您必须使用新样式的类。要在 Python 2 中使用新型类,您必须从 object
继承。将您的班级定义更改为class Test(object)
。
【讨论】:
在我的情况下,没有object
,即使对于 Python 3 也无法工作以上是关于python - 为啥只读属性是可写的?的主要内容,如果未能解决你的问题,请参考以下文章