在Python中什么时候应该使用属性(attributes),而什么时候应该使用属性(properties)?

12

我有一个快速的问题,我有点难以理解何时使用属性和何时使用普通的属性。对我来说,这个区别有点模糊。如果有关于这个主题的任何资源,那就太好了,谢谢!


3
在属性获取或设置时,只需使用普通属性,直到你发现需要执行某些“特殊”操作。然后使用一个属性(property)。或者,如果你想让属性是只读的。 - Keith
对我来说,Python社区的人似乎比C#社区更容易理解这个问题的正确答案,尽管后者有相同的工具。 - Karl Knechtel
4个回答

20

属性比属性更加灵活,因为您可以定义函数来描述在设置、获取或删除它们时应该发生什么。如果不需要这种额外的灵活性,请使用属性-它们更容易声明并且速度更快。

在像Java这样的语言中,通常建议始终编写getter和setter,以便将来可以用更复杂的版本替换这些函数。在Python中没有必要这样做,因为客户端代码访问属性和属性的语法是相同的,因此您可以随时选择在不破坏向后兼容性的情况下 later on, 使用属性。


+1,但我认为相反,即对我来说,一个“属性”更加灵活,因为它是完全自由的,您可以从内部和外部对数据进行任何操作...另一方面,“属性”是被封装机制钩住、控制、限制和约束的(但我同意我们也可以将这些能力视为某种“灵活性”)。但我想这意味着相同的事情,只是表达方式不同 :-) - cedbeu
1
@cblab:这个问题是从类实现者的角度提出的。对于类实现者来说,属性更灵活,因为你可以使用属性模拟属性的确切行为。 - Sven Marnach
1
啊,是的,真的……我必须承认,我从来没有想过用属性模拟属性的使用……有点没用,对吧?这就像添加一些代码行,除了存在外没有其他目标:)但你绝对是正确的,在这个意义上它可以做更多,所以更灵活。 - cedbeu

16

重点是语法是可以互换的。始终从属性开始。如果发现在访问属性时需要进行额外的计算,则将其替换为属性。


6
这里是重点!在其他语言中(咳咳Java咳咳),一旦你将某个东西定义为属性,如果想要更多的控制,就不能回头再改变它。因此,你必须编写所有这些不必要的getter和setter,以便以后有更改选项。在Python中,你可以仅编写普通属性,并在不改变外部API的情况下在内部将其替换为属性! - Katriel
我不完全同意。有时候一个人可能想要从定义某些东西为属性开始。例如,当你希望它的值是只读的,或者它是一些可以在需要时计算但不被引用足够多以证明将其值存储在每个实例中都是合理的情况下。 - martineau
您始终可以随时在任何语言中更改任何内容;这只是涉及工作量问题。 - Karl Knechtel

2

属性是属性和后期封装。

当您将属性转换为属性时,只需定义一些getter和setter即可“附加”到它上面,这将挂钩数据访问。然后,您无需重写其余代码,访问数据的方式相同,无论您的属性是属性还是不是。

由于这种非常聪明和强大的封装机制,在Python中,您通常可以使用属性(没有先验封装,因此没有任何getter或setter),除非在访问数据时需要执行特殊操作。

如果是这样,那么您只需要定义设置器获取器(如果需要),并将它们“附加”到属性上,将其转换为属性,而不会对代码的其他部分产生任何影响(而在Java中,通常在创建字段时,通常是私有的,第一件事就是创建与之关联的gettersetter方法)。

关于属性、属性和描述符的好页面在这里


1

除了Daniel Roseman所说的内容,当我需要包装某些东西时,我经常使用属性。也就是说,当我不存储信息而是由包装对象来存储时,属性可以成为极好的访问器。


实际上,您可以从包装对象自动生成这些内容,然后您的对象具有您要包装的任何方法和属性。非常方便。 - kindall

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