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 为什么;使用属性隐藏功能实现“;当设计继承时?_Python_Oop - Fatal编程技术网

Python 为什么;使用属性隐藏功能实现“;当设计继承时?

Python 为什么;使用属性隐藏功能实现“;当设计继承时?,python,oop,Python,Oop,下面是一个例子。我不理解“在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。”以及注释3: 对于简单的公共数据属性,最好只公开属性名称,而不公开复杂的访问器/变异器方法。请记住,如果您发现一个简单的数据属性需要增加功能性行为,Python提供了一条通向未来增强的简单途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面 注1:属性仅适用于新样式的类 注2:尽管缓存等副作用通常是好的,但尽量保持功能行为没有副作用 注3:避免将属性用于计算昂贵的操作;属性表示法使调用

下面是一个例子。我不理解“在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。”以及注释3:

对于简单的公共数据属性,最好只公开属性名称,而不公开复杂的访问器/变异器方法。请记住,如果您发现一个简单的数据属性需要增加功能性行为,Python提供了一条通向未来增强的简单途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面

注1:属性仅适用于新样式的类

注2:尽管缓存等副作用通常是好的,但尽量保持功能行为没有副作用

注3:避免将属性用于计算昂贵的操作;属性表示法使调用方相信访问(相对)便宜


隐藏实现的目标是保持API不变

如果您设计了一个具有简单属性的类,但后来发现子类需要计算才能返回正确的值,则只需将简单属性替换为计算属性,相关API保持不变。计算属性更好地称为属性


注3是一个建议,在设计类时要牢记,而不是在对其进行子类化时。

您知道什么是属性吗?如果没有,那就从阅读开始,多了解他们;如果属性增长为功能性行为,谁知道它是否会变得昂贵?但是,隐藏复杂性会让用户知道成本低廉,无论在幕后发生了什么。请缩小你不理解/需要知道的范围。否则,这个问题可能会以主要基于意见的方式结束。@PeterWood:这很公平,但这是注3(IMHO)的要点:如果您怀疑在未来的版本中计算可能会变得昂贵,那么您的接口应该使用显式setter&getter方法。否则,请使用属性使接口保持简单,以便可以使用简单的属性访问。但我想问题是:计算费用的临界点是什么?我的直觉是,如果你的setter/getter可以在O(1)中完成,那么把它作为属性“隐藏”可能是可以的,除非它(比如)比真正的属性访问慢一个数量级。@pm2ring这并不是一个真正的远见问题-Guido以前曾争辩过(没有特别反对)复杂性的重大变化(对于“重要”的定义)很可能已经足够打破兼容性,值得对接口进行更改。