繁体   English   中英

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

[英]python: Create read-only properties that can be written by self using assignment

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

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

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不适合这种设计。 您应该只记录该属性是私有的,并给它起一个以下划线开头的名称(一个下划线,而不是两个下划线)。 这清楚地表明,如果其他人编写了与之混淆的代码,那他们就是一个人,然后如果他们这样做并且出了点问题,那是他们自己的错。 强制执行类私有访问几乎没有真正的好处。

但是请注意,由于您没有正确使用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 )将无法设置该值。

但是,这也是您应该重新考虑的事情。 定义这样的琐碎吸气剂没有真正意义。 仅命名属性_myAttrib并直接读取其值,并记录该值不应更改,会更简单。 属性的重点不是提供关于谁应该访问和不应该访问属性的协议的强制性; 关键是当值被获取/设置时允许以编程方式计算或操纵值(例如,设置属性还可以更新对象上的其他链接属性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM