我尝试通过不提供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
有没有办法实现这个目标?
答案 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
并直接读取其值,并记录该值不应更改,这样更简单。属性的重点不是提供关于谁应该和不应该访问属性的协议的执行;关键是允许在获取/设置值时进行编程计算或操作值(例如,设置属性也会更新对象上的其他链接属性)。