Python:何时不应使用属性

4

我一直在学习使用@property修饰符来代替getter和setter。很多人似乎更喜欢使用@property而不是getter和setter。

无论哪种方式更受欢迎,它们大部分时间是否真的必要?我觉得对于所有内部变量都使用@property可能有些多余,尤其是当变量像下面这样简单的时候。如果它们能够工作,那么简单的事情应该保持简单吧?

class Ex():
    def __init__(self, value):
        self.__x = value

    @property
    def x(self):
        return self.__x
    @x.setter
    def x(self, value):
        self.__x = value

我认为@property并未提供额外的安全性(如果确实需要的话),因为有意者仍然可以访问变量。(._Ex__x)

什么时候应该使用@property(当不存在验证和未来更改的情况下)?什么时候不应该使用它们?


是的,绝对不要在这里使用属性。这是毫无意义的。属性为您提供了封装而无需样板文件。 - juanpa.arrivillaga
如果您不需要验证或可变性,请使用 namedtuple - Peter Wood
@ThierryLathuille 谢谢。在发布问题之前,我已经阅读过它,但我的问题可能可以用“无论哪个是理想的,它们大多数时候都是必需的吗?”来概括。 - Seung
链接的重复问题并不是在问同样的问题;它询问是否使用属性或getter/setter。而这个问题则是在询问何时使用属性与简单变量。 - Jonathon Reinhart
注意,你可能不应该使用双下划线名称重整。这是为了防止子类中的冲突,而不是为了使某些变量“私有”。Python没有私有变量。双下划线名称重整与属性实际上没有任何关系。 - juanpa.arrivillaga
1个回答

4

PEP 8,Python代码风格指南如下:

对于简单的公共数据属性,最好只暴露属性名,而不是复杂的访问器/修改器方法。

就像你展示的那样,没有其他逻辑的属性与使用简单属性相比没有任何优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接