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

h3d*_*ndi 19 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:
        m = "frustrated"
    else:
        m = "mad"
    return m
Run Code Online (Sandbox Code Playgroud)

它只是在运行中计算并返回计算.它不提供对私有属性或类的任何属性的访问.这是财产而不是方法更好吗?

Ben*_*Ben 21

属性不用于提供对私有属性的访问.属性旨在为您提供使零参数方法可访问的选项,就像它们是属性一样,以便给定的"属性"可以实现为计算或实际属性,而无需更改类的接口.

因此,它通常不是一个"更好"的问题,而是一个依赖于背景的利弊的设计决策.

在这种情况下,无论这个对象是什么支持x.hunger,x.boredomx.mood.为什么不x.mood()呢?你可以,尽管在界面中永久暴露它一个计算而不是存储.

如果该类的先前版本具有"真实" mood属性,并且该对象的必需不变量意味着任何内部方法更新boredom或者hunger还必须仔细设置mood为一致,则引入该属性将是一个极好的重构; 界面保持不变,但现在保证永久保持不变,而不是必须小心维护.整个领域的错误都不可能发生.

另一方面,如果mood计算成本昂贵,或者有副作用,那么作为常规方法可能会好得多.使它看起来像一个属性访问意味着客户端代码的程序员可能会觉得它作为一个属性访问,这是廉价和非破坏性的; 这将是错误或性能问题的丰富来源.


glg*_*lgl 7

这只是一个品味问题。

属性用于访问成本相当低的情况,例如仅查询“私有”属性或简单计算。

一种方法用于发生相当“复杂”的过程并且该过程是主要的。

人们习惯于使用 getter 和 setter 方法,但趋势是越来越多地使用属性。

Serial以类为例pyserial。它具有 - 作为传统 - 方法,例如getBaudRate()setBaudRate(),但建议将其用作baudrate查询和设置波特率的读写属性。


qwe*_*ynl 5

我认为没有任何真正的区别。

它只是允许你做obj.mood而不是obj.mood()