多谢图灵出版社英子赠书!本文会读一部分写一部分,随时更新,如果我认为可以另外新写一篇就终止前面一篇。建议读者如果有不太明白的地方,下载代码运行、调试一下,会改善理解。至于翻译质量评价,等我读完再说。

流畅的Python-fluent-python

流畅的Python-Fluent Python

这书的中文版本都很厚,英文版会再厚上1/3。可想而知这本书的内容丰富程度。另外,此书不是入门书,入门请先看别的书籍。不然看起来会很费劲。关于Python的书很多,但是面向中高级读者的书可不多,这本算一个,英文版评价很高。我本人会多种编程语言,C/C++/PHP/Python/JavaScript等能混用,可以任意切换编程环境和不同语言的思维模式。因此我会在文章中,写入我对编程的一些理解,而不仅限于Python,有联系的内容都会写上。

作者在前言部分就做了声明:“这本书不是一本完备的Python使用手册,而是会强调Python作为编程语言独有的特性。。。”

在我的C++时代,我下功夫研究过STL的设计和实现。STL的设计里面,提到了一个重要概念:正交 – 彼此可以独立变化而相互不干扰。Python的设计也有这个影子。

比如:len()是通用的函数,它可以广泛应用于对象,对象则不必自己实现object.len()函数。另外,如果对象实现了外部函数操作接口规范,则自动获得了相应的函数操作支持,比如“[]”操作符。这会给一些编码带来很多的方便,增强了通用性。但是,len函数的实现其实又有特别处理,有一段提到了这个事情。它为了性能,给内置的对象开了后门。“实用胜于纯粹”,不过,使用者不用管这个。

第一部分,主要提到“特殊方法”。我觉得可以这么理解,特殊方法是一套机制。1是为了满足Python内部精巧的正交设计,它要这么做才方便,对于操作来说,一致性很强。容易记忆,也不易出错;2是给用户提供了高级的hook方法,即挂钩。当你不满足系统默认行为或者需要自己实现的时候,可以对这些方法作出修改和实现。实际上C++也有“运算符重载”,理念是类似的。它在语法上像个语法糖,让你爽,在实现上又有一致性,细节通过对象接口封闭,耦合低,便于维护。3是可以看成接口机制。当下的Python对象有多达83个特殊方法,一部分是运算符的实现操作,另外一部分则跟字符串表示、集合模拟、数值转换、对象管理相关。

比如集合模拟,你定义的对象,如果实现了相关的方法,就可以当成这种对象来用,使用对象的操作就会简化,代码也更为清楚。

列举几个:

字符串类  __repr__, __str__, __format__, __bytes__

调用截取 __call__

属性操作 __get__, __set__, __delete__

注意,这里面有一些陷阱,推荐一本入门书:《Python 学习手册》 – Learning Python 在第30章里面有更细致的说明。

相比之下,其它我了解的几个语言,就没有设计的这么细致精巧了。

PHP里面也有类似的设定,但是控制的范围很有限。比如__get(), __set(), __call()。JavaScript,这货的原型对象模式走到了灵活的极致境界,连原生对象的方法都能覆盖掉,当然带来的坑也是一地。当然,这是另外一个话题了。

第一章最后一部分,提供了一些延伸的参考资料,对几个不同语言在特殊方法上的实现做了比较。

记得收藏下这个高人的网址:http://stackoverflow.com/users/95810/alex-martelli

Alex-Martelli

不理解的问题,多找找他的回答。

本书的实例代码库在这里:https://github.com/fluentpython/example-code

 

流畅的Python-Fluent Python读书笔记-02-序列构成的数组
为解决CSS设计难题而生-评《CSS揭秘》