1

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

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

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

有没有办法做到这一点?

4

1 回答 1

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)

NowmyAttrib是一个提供对底层属性的读取访问的属性_myAttrib。这就是属性在 Python 中的工作方式。另请注意,您没有将值传递"I'm the read-only property."property,而是直接在基础属性上设置它。

如果你愿意,你可以做一个这样的属性,然后_myAttrib直接在你的类的代码中设置。这就像您似乎想要的那样:它可以让您设置值,但是使用该属性(而不是“秘密” _myAttrib)的其他代码将无法设置它。

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

于 2013-03-05T19:32:48.260 回答