Python 为什么;使用属性隐藏功能实现“;当设计继承时?
下面是一个例子。我不理解“在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。”以及注释3: 对于简单的公共数据属性,最好只公开属性名称,而不公开复杂的访问器/变异器方法。请记住,如果您发现一个简单的数据属性需要增加功能性行为,Python提供了一条通向未来增强的简单途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面 注1:属性仅适用于新样式的类 注2:尽管缓存等副作用通常是好的,但尽量保持功能行为没有副作用 注3:避免将属性用于计算昂贵的操作;属性表示法使调用方相信访问(相对)便宜Python 为什么;使用属性隐藏功能实现“;当设计继承时?,python,oop,Python,Oop,下面是一个例子。我不理解“在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。”以及注释3: 对于简单的公共数据属性,最好只公开属性名称,而不公开复杂的访问器/变异器方法。请记住,如果您发现一个简单的数据属性需要增加功能性行为,Python提供了一条通向未来增强的简单途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面 注1:属性仅适用于新样式的类 注2:尽管缓存等副作用通常是好的,但尽量保持功能行为没有副作用 注3:避免将属性用于计算昂贵的操作;属性表示法使调用
隐藏实现的目标是保持API不变 如果您设计了一个具有简单属性的类,但后来发现子类需要计算才能返回正确的值,则只需将简单属性替换为计算属性,相关API保持不变。计算属性更好地称为属性
注3是一个建议,在设计类时要牢记,而不是在对其进行子类化时。您知道什么是属性吗?如果没有,那就从阅读开始,多了解他们;如果属性增长为功能性行为,谁知道它是否会变得昂贵?但是,隐藏复杂性会让用户知道成本低廉,无论在幕后发生了什么。请缩小你不理解/需要知道的范围。否则,这个问题可能会以主要基于意见的方式结束。@PeterWood:这很公平,但这是注3(IMHO)的要点:如果您怀疑在未来的版本中计算可能会变得昂贵,那么您的接口应该使用显式setter&getter方法。否则,请使用属性使接口保持简单,以便可以使用简单的属性访问。但我想问题是:计算费用的临界点是什么?我的直觉是,如果你的setter/getter可以在O(1)中完成,那么把它作为属性“隐藏”可能是可以的,除非它(比如)比真正的属性访问慢一个数量级。@pm2ring这并不是一个真正的远见问题-Guido以前曾争辩过(没有特别反对)复杂性的重大变化(对于“重要”的定义)很可能已经足够打破兼容性,值得对接口进行更改。