类属性前的一个下划线和没有setter的@property之间有什么区别



我知道python没有真正的私有类属性,我们可以在_<property>之前指定一个下划线来表示弱保护。如果我们在没有setter的情况下使用@property装饰器,其他人将无法更改此属性的值。

所以我的问题是,如果上面的说法是真的,为什么我们需要有一个下划线,而我们可以禁用其他人来更改值?有什么区别?作为一个python编程的新手,我感谢你的时间和耐心。

谢谢!

前导下划线约定告诉读者,变量是不应依赖的实现细节。变量是"私有"的,因为它是一个内部类,您不希望客户端代码使用它。

只使用getter属性管理属性并不是将其标记为私有,而是将其标记成公共只读。它告诉客户端代码,它可以依赖于属性的存在,但不能更改其值。

不同之处在于,由于python允许任意绑定,因此没有setter的property仍然可以设置,对用户来说几乎没有明显的差异。

In [4]: class Foo:
...:     @property
...:     def bar(self):
...:         return 1
...:
In [5]: foo = Foo()
In [6]: foo.bar
Out[6]: 1
In [7]: foo.bar = 2
In [8]: foo.bar
Out[8]: 2

@property.setter用于属性的计算设置,比如沿着这些线的数据类型转换。对于您所描述的内容,建议使用前导下划线的受保护约定,因为您没有实现.setter,这并不能阻止用户为您设置属性。

最新更新