Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当不需要访问属性时Python属性vs方法?_Python_Properties - Fatal编程技术网

当不需要访问属性时Python属性vs方法?

当不需要访问属性时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:

我正在阅读“面向绝对初学者的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:
        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的重点!但这只是表明这是一个主观决定,没有“正确”的答案。:)是的,我明白你的意思。最好是隐藏起来。