16

我正在尝试在 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。我所看到的,是预期的吗?如何确保属性不可设置?

4

2 回答 2

24

要使其按您的预期工作,Test需要是一个新样式的类:

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

这在以下文档中property()有所暗示:

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

当我Test变成一个新式类,并尝试改变prop时,我得到一个例外:

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

AttributeError: can't set attribute
于 2013-03-17T07:52:36.847 回答
4

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

于 2013-03-17T07:52:53.550 回答