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 - 为啥只读属性是可写的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥非阻塞套接字在connect() 或accept() 之前是可写的?

我可以将一个美味的模型资源字段设为只读吗?

svn只有两种状态吗?只读和可写吗

JavaScript getComputedStyle

ext中textarea的readOnly属性设置问题

从目录中删除只读属性