python:创建只读属性,这些属性可以通过自用赋值来编写

python:创建只读属性,这些属性可以通过自用赋值来编写,python,properties,Python,Properties,我试图通过不提供setter来创建只读属性。但似乎在同一个类中,我也无法写入该属性 只读属性就是这样工作的吗?我确实需要在它的类中修改它,但不希望它被其他类编写。这就是为什么我更喜欢能够: class MyClass(object) def __init__(self): self.myAttrib = None def getx(self): return self.myAttrib myAttrib = property(getx,

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

有没有办法做到这一点?

是的,这就是它的工作原理。只读意味着只读,而不是“某些类可读,其他类可写”

可能可以使其仅由其类编写,但您应该考虑为什么需要这样做。一般来说,Python不适合这种设计。您应该只记录属性是私有的,并且可能给它一个以下划线(一个下划线,而不是两个下划线)开头的名称。这清楚地表明,如果其他人编写的代码弄乱了它,那是他们自己的错,如果他们这样做了,出了问题,那就是他们自己的错。强制类私有访问没有什么实际好处

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

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

def getx(self):
    return self._myAttrib

myAttrib = property(getx)
现在,
myAttrib
是一个属性,它提供对底层属性的读取访问。这就是Python中属性的工作方式。还请注意,您没有将值
“我是只读属性”传递给
属性,而是直接在基础属性上设置它

如果需要,您可以这样做一个属性,然后直接在类的代码中设置
\u myAttrib
。这与您似乎想要的类似:它允许您设置值,但使用该属性的其他代码(而不是“secret”
\u myAttrib
)将无法设置它


然而,这也是你应该重新考虑的。像这样定义一个微不足道的getter是没有实际意义的。只需命名属性
\u myAttrib
并直接读取其值,并记录不应更改该值,就更简单了。属性的要点不是提供关于谁应该和不应该访问属性的协议的实施;关键是允许在获取/设置值时进行编程计算或操作(例如,设置属性也会更新对象上的其他链接属性)。

是的,这就是它的工作原理。只读意味着只读,而不是“某些类可读,其他类可写”

可能可以使其仅由其类编写,但您应该考虑为什么需要这样做。一般来说,Python不适合这种设计。您应该只记录属性是私有的,并且可能给它一个以下划线(一个下划线,而不是两个下划线)开头的名称。这清楚地表明,如果其他人编写的代码弄乱了它,那是他们自己的错,如果他们这样做了,出了问题,那就是他们自己的错。强制类私有访问没有什么实际好处

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

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

def getx(self):
    return self._myAttrib

myAttrib = property(getx)
现在,
myAttrib
是一个属性,它提供对底层属性的读取访问。这就是Python中属性的工作方式。还请注意,您没有将值
“我是只读属性”传递给
属性,而是直接在基础属性上设置它

如果需要,您可以这样做一个属性,然后直接在类的代码中设置
\u myAttrib
。这与您似乎想要的类似:它允许您设置值,但使用该属性的其他代码(而不是“secret”
\u myAttrib
)将无法设置它


然而,这也是你应该重新考虑的。像这样定义一个微不足道的getter是没有实际意义的。只需命名属性
\u myAttrib
并直接读取其值,并记录不应更改该值,就更简单了。属性的要点不是提供关于谁应该和不应该访问属性的协议的实施;关键是允许在获取/设置值时进行编程计算或操作(例如,设置属性也会更新对象上的其他链接属性)。

这通常被称为私有属性。(至少在Java/C++/C#land中)。做这种通常被称为私人财产的事情并不太像蟒蛇。(至少在Java/C++/C#land中)。我明白了,做这样的事不是很像蟒蛇。所以Python只读属性就像C++类中的const属性,类似这样吗?我想你可以这么说。它只是一个无法设置的属性。但是,请参阅我编辑的答案以了解更多信息。这与您的主要问题无关,但您的代码未正确使用
属性。谢谢您的详细回答!我想我现在明白了。好的,我明白了。所以Python只读属性就像C++类中的const属性,类似这样吗?我想你可以这么说。这只是一个例子