gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:03 24 4
gpt4 key购买 nike

我试图通过不提供 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

有什么办法可以实现吗?

最佳答案

是的,这就是它应该如何工作的。 Read-only是只读的意思,不是“有的类可读,有的类可写”。

也许可以让它只能被它的类写入,但是你应该想想为什么你想要这个。一般来说,Python 不适合这种设计。您应该只记录该属性是私有(private)的,并可能给它一个以下划线开头的名称(一个下划线,而不是两个)。这清楚地表明,如果其他人编写的代码弄乱了它,那是他们自己的问题,然后如果他们这样做而出现问题,那是他们自己的错。强制类私有(private)访问几乎没有真正的好处。

不过请注意,您的代码无论如何都有一些错误,因为您没有正确使用 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。这将是您想要的东西:它会让您设置值,但使用该属性的其他代码(而不是“ secret ”_myAttrib)将无法设置它。

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

关于python:创建可以使用赋值自行编写的只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com