<p>最大的优点是内置函数(和运算符)可以在适当的时候应用额外的逻辑,而不仅仅是简单地调用特殊的方法。例如,<code>min</code>可以查看多个参数并应用适当的不等式检查,或者它可以接受一个iterable参数并以类似的方式进行;<code>abs</code>当在没有特殊方法的对象上调用时,<code>__abs__</code>可以尝试将所述对象与0进行比较,并在需要时使用对象更改符号方法(尽管目前没有);等等。在</p>
<p>因此,为了一致性,所有具有广泛适用性的操作必须始终通过内置和/或运算符,而这些内置的职责是查找和应用适当的特殊方法(在一个或多个参数上),在适用的情况下使用替代逻辑,等等。在</p>
<p>这个原则没有被正确地应用(但是在python3中这种不一致性得到了修复)是“step An iterator forward”:在2.5和更早版本中,您需要在迭代器上定义并调用非特殊命名的<code>next</code>方法。在2.6和更高版本中,您可以用正确的方式来做:迭代器对象定义<code>__next__</code>,新的<code>next</code>可以调用它<em>并且</em>应用额外的逻辑,例如提供一个默认值(在2.6中,为了向后兼容,您仍然可以用不好的旧方法来做,但是在<code>3.*</code>中,您不能再这样做了)。在</p>
<p>另一个例子:考虑表达式<code>x + y</code>。在传统的面向对象语言中(只能对最左边的参数进行调度——比如Python、Ruby、java、C++、C、C和C),如果^ {CD9}}是一些内置类型,^ {< CD10}}是您自己的新奇类型,如果语言坚持将所有逻辑委托给^ {CD11}}的方法,那么您将不幸落空。加法(假设语言允许运算符重载;-)。在</p>
<p>在Python中,<code>+</code>操作符(当然还有内置的<code>operator.add</code>,如果你喜欢的话)会尝试x的类型<code>__add__</code>,如果这个操作符不知道如何处理<code>y</code>,那么就尝试y的类型<code>__radd__</code>。因此,您可以定义知道如何将自身添加到整数、浮点、复数等中的类型,也可以定义知道如何将此类内置数字类型添加到自身的类型(即,您可以对其进行编码,使<code>x + y</code>和{<cd18>}都能正常工作,当<code>y</code>是您喜欢的新类型的实例,<code>x</code>是某个内置数字类型的实例时)。在</p>
<p>“泛型函数”(如PEAK中的)是一种更优雅的方法(允许基于类型组合的任何重写,<em>从不</em>,疯狂的单项式关注OOP鼓励的最左边的参数!-),但(a)不幸的是,python3不接受它们,(b)它们确实要求泛型函数以独立的形式表示(将函数视为“属于”任何一个类型是绝对疯狂的,关键在于,可以根据其多个参数类型的任意组合来不同地重写/重载!-). 任何使用过通用Lisp、Dylan或PEAK编程的人都知道我在说什么;-)。在</p>
<p>因此,独立的函数和运算符是正确的、一致的方法(尽管在简陋的Python中,缺少泛型函数确实消除了<em>一些</em>固有优雅的部分,但它仍然是优雅和实用性的合理结合!-). 在</p>