- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图通过不提供 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/
我发现以下帖子非常有帮助: How to pickle yourself? 但是,此解决方案的局限性在于,重新加载类时,它不会以其“运行时”状态返回。即它将重新加载所有变量等以及类在转储时的一般状态.
我是一名优秀的程序员,十分优秀!