写Python的人几乎都踩过这个坑:明明没给对象写任何方法,len()和+号却像开了天眼一样能工作。这背后不是魔法,是一套被官方藏进文档角落的「双下划线协议」。
Python团队从1993年就埋了这套机制。对象只要实现__len__(),len()函数就会自动找上门;__add__()写好了,+号就懂怎么相加。官方管这叫「数据模型」,但老程序员更爱叫它dunder methods——double underscore的缩写,听着像某种地下接头暗号。
Guido van Rossum早年解释设计初衷时说过:「我们想让用户自定义的类型,和内置类型一样自然。」这句话的潜台词是:Python自己也是这么干的。list、str、int这些内置类的底层,全是密密麻麻的__getitem__、__iter__、__repr__在撑场面。
但官方教程花了整整十年才肯正面教这个。2000年代的入门书还在教「Python是简单的」,直到2010年后社区倒逼,文档才新开「Data Model」专章。现在PyCon上问十个开发者,仍有六个说不清__eq__和is的区别——不是他们不用,是这套系统藏得太深了。
最近一个细节被翻出来:Python 3.11给错误提示加了颜色,但__repr__的报错信息还是1999年的风格。有用户在issue区吐槽:「我的对象打印出来像加密电报,调试全靠猜。」这条评论收获了四百多个。
热门跟贴