当不需要访问属性时Python属性vs方法?
我正在阅读“面向绝对初学者的Python编程”,其中有一段代码:当不需要访问属性时Python属性vs方法?,python,properties,Python,Properties,我正在阅读“面向绝对初学者的Python编程”,其中有一段代码: @property def mood(self): unhappiness = self.hunger + self.boredom if unhappiness < 5: m = "happy" elif 5 <= unhappiness <= 10: m = "okay" elif 11 <= unhappiness <= 15:
@property
def mood(self):
unhappiness = self.hunger + self.boredom
if unhappiness < 5:
m = "happy"
elif 5 <= unhappiness <= 10:
m = "okay"
elif 11 <= unhappiness <= 15:
m = "frustrated"
else:
m = "mad"
return m
@属性
情绪(自我):
不快乐=自我饥饿+自我厌倦
如果不快乐<5:
m=“快乐”
elif 5我认为没有任何真正的区别
它只允许你做obj.mood
而不是obj.mood()
这只是口味的问题
属性用于访问成本较低的地方,例如仅查询“private”属性或简单的计算
当一个相当“复杂”的过程发生时,使用一种方法,这个过程是最主要的
人们习惯于使用getter和setter方法,但是越来越多的人倾向于使用属性
以pyserial
的Serial
类为例。作为传统,它有一些方法,如getBaudRate()
和setBaudRate()
,但建议将baudrate
用作查询和设置波特率的读写属性。属性不用于提供对私有属性的访问。属性旨在让您选择将零参数方法作为属性进行访问,以便给定的“属性”可以实现为计算或实际属性,而无需更改类的接口
因此,这通常不是一个“更好”的问题,而是一个设计决策,其利弊取决于上下文
在这种情况下,无论该对象是什么,都支持x.hunger
、x.boredom
和x.mood
。为什么不x.mood()
?您可以,尽管这会在接口中永久公开它是一个计算,并且不会存储
如果类的早期版本具有“real”mood
属性,并且对象的必需不变量意味着更新boredom
或hunger
的任何内部方法也必须小心地将mood
设置为一致,那么引入该属性将是一个极好的重构;接口保持不变,但现在可以保证不变量始终保持不变,而不必仔细维护。整个领域的错误是不可能发生的
另一方面,如果情绪
的计算成本很高,或者有副作用,那么它可能会比普通方法好得多。让它看起来像一个属性访问,意味着客户端代码程序员可能会认为它是一个属性访问,这是廉价和非破坏性的;这将是bug或性能问题的丰富来源。这本质上是一种偏好。它允许您键入object.property
,而不是object.property()
那你什么时候应该用哪个?你必须根据上下文来决定。如果您使用的方法返回一个基于对象属性的值,则可以节省创建变量并将其设置为与某个生成器方法相等的时间(例如:property=object.generateProperty()
。跳过此步骤,将generateProperty()
设置为自己的属性难道不更有意义吗
这是我理解的一般概念。是的,我确实得出了相同的结论,即它是设计决策,而mood()更好,因为它显示了计算。这样人们知道它没有被存储。@h3dkandi实际上是我的结论(在本例中)最好不要公开这是一个计算;抽象接口和封装实现细节毕竟是OO的重点!但这只是表明这是一个主观决定,没有“正确”的答案。:)是的,我明白你的意思。最好是隐藏起来。