【问题标题】: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。我所看到的,是预期的吗?如何确保属性不可设置?

【问题讨论】:

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


    【解决方案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 也无法工作
    猜你喜欢
    • 2014-10-20
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2015-07-10
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多