python:创建可以由self使用赋值编写的只读属性

时间:2013-03-05 19:29:10

标签: python properties

我尝试通过不提供setter来创建只读属性。但似乎在同一个类中我也无法写入该属性。

这是一个只读属性应该如何工作?我确实需要在其类中修改它,但不希望它由其他类编写。这就是为什么我更喜欢能够:

class MyClass(object)
    def __init__(self):
        self.myAttrib = None

    def getx(self):
        return self.myAttrib

    myAttrib = property(getx, "I'm the read-only property.")

    def MyMethod(self):
        self.myAttrib = myValue

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:7)

是的,这就是应该如何运作的。只读是指只读,不是“某些类可读,而是其他人可写”。

这可能是因为它只能由它的类写,所以你应该考虑为什么你想要它。通常,Python不适合这种设计。您应该只记录该属性是私有的,并且可能给它一个以下划线开头的名称(一个下划线,而不是两个)。这清楚地表明,如果其他人编写与其混淆的代码,那么他们就是独立的,然后如果他们这样做并且出了问题,那就是他们自己的错。实施类私有访问几乎没有什么好处。

但请注意,您的代码仍有一些错误,因为您没有正确使用property。您将为该属性提供与其访问的基础属性相同的名称。如果您的属性名为myAttrib,则其getter / setter应使用不同的名称获取/设置属性。属性的名称是属性本身的名称,而不是存储其获取/设置的值的隐藏属性。更像是:

def __init__(self):
    self._myAttrib = "I'm the read-only property."

def getx(self):
    return self._myAttrib

myAttrib = property(getx)

现在myAttrib是一个提供对基础属性_myAttrib的读访问权限的属性。这就是属性在Python中的工作方式。另请注意,您未将值"I'm the read-only property."传递给property,而是将其直接设置在基础属性上。

如果您愿意,可以执行此类属性,然后直接在类的代码中设置_myAttrib。这将是你想要的东西:它可以让你设置值,但使用属性的其他代码(而不是“秘密”_myAttrib)将无法设置它。

然而,这也是你应该重新考虑的事情。没有真正的意义来定义像这样的微不足道的吸气剂。只需命名属性_myAttrib并直接读取其值,并记录该值不应更改,这样更简单。属性的重点不是提供关于谁应该和不应该访问属性的协议的执行;关键是允许在获取/设置值时进行编程计算或操作值(例如,设置属性也会更新对象上的其他链接属性)。