python - 为什么只读属性可写?

时间:2013-03-17 07:44:36

标签: python properties python-2.7 readonly private-members

我试图在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。我所看到的,是否有望?如何确保属性不可设置?

2 个答案:

答案 0 :(得分:24)

为了使其按预期工作,Test必须是新式的类:

class Test(object):
          ^^^^^^^^

documentation for property()

中暗示了这一点
  

返回新样式类的属性属性(派生自object的类)。

当我将Test转换为新式课程并尝试更改prop时,我得到一个例外:

In [28]: t.prop='Re-Init'

AttributeError: can't set attribute

答案 1 :(得分:4)

要使用属性,必须使用新式类。要在Python 2中使用新式类,必须从object继承。将您的班级def更改为class Test(object)