第一章”Python Data Model”中主要介绍了Python中的特殊方法和一致性的优美。特殊方法在Python中无处不在,例如class中初始化__init__
函数,对象的字符串表示__str__
和 __repr__
等等。
使用特殊方法(special methods)
在Python中, 特殊方法又常被称为magic method, 命名以双下划线开头,双下划线结尾, 例如__init__
.
特殊方法常被隐式的调用
当使用方括号,例如
obj[key]
的时候,其实Python解释器是调用了obj.__getitem__
方法。用
for...in...
的时候,是解释器调用了__iter__
方法,a in b
这里in用了__contains__
特殊方法一般由解释器调用
有一些特殊例子例如
len
, 如果对象是用户定义的, 那len(a)
会调用定义的__len__
method。如果对象是Python内建对象,在CPython中则会直接返回PyVarObject
中的ob_size
值, 速度比调用自定义方法更快。一般很少手动调用特殊方法,最常用的应该就是初始化函数__init__
了。 像len
,iter
,str
等方法在CPython中他们对于内建对象往往有特殊处理,会更快。__str__
和__repr__
的区别在class中我们经常用到这两个方法,如果2选1的话首先要实现
__repr__
方法,__str__
往往返回一个人类易读的字符表示,__repr__
则应该尽可能表现出这个class的唯一性,能够通过这个方法找到对应的对象。repr
函数可以返回对象的字符串表示。
Python中的一致性(consistency)
作者开篇就提到:
One of the best qualities of Python is its consistency.
语言中的一致性可以让使用者在一些时候猜测或者自然的推理出正确的结果,特别是遇到一些新东西的时候。在设计中的这种一致性和符合人们直觉的设计让我想到了苹果的触摸控制,不论滑动还是放大缩小等操作,都符合人们的直觉。 最重要的是在手机上,iPad亦或者是在mac的触摸板上的操作保持着一致性,学习成本很低。
为什么len不是一个method
当我们想知道一个list的长度时,Python中使用len(a)而不是a.len().
作者在2013年就这个问题问了一位核心开发者。他对此的回答是:
the key to his answer wa a quote from the Zen of Python: “practicality beats purity”.
翻译一下就是实用性比纯粹更重要。在这里当对象是一个内建(built-in)对象的时候,len会比调用函数更快(第一部分中提到了)
关于The Zen of Python 可以进入Python iterpreter 输入import this
查看。