3.3.7 重载

在数据类型中提供运算符的自定义能力是一种多态性,称为运算符重载。在Python语言中,你几乎可以重载所有的运算符,包括算术运算符、比较运算符、索引和切片。你也可以重载内置函数,包括绝对值、长度、哈希法和类型转换。重载运算符和内置函数使得用户自定义类型的行为与内置类型更加一致。

1. 特殊方法

Python用于支持重载的机制是将每个运算符和内置函数与一个特殊方法关联起来。尽管读者已经在若干数据类型的实现中了解到特殊方法的使用(特别是Complex和Vector),我们还是简单总结一下这种概念。

执行一种运算时,Python在内部将表达式转换为调用对应的特殊方法。调用一个内置函数时,Python在内部调用对应的特殊方法来替代。要重载一个运算符或内置函数,只需在代码中包含对应特殊方法的一种实现。例如,每当Python发现客户端代码中的x + y,则将该表达式转换为特殊方法调用x.__add__(y)。因而,要在自定义数据类型中重载+运算符,则只需包含特殊方法__add__()的一种实现即可。同样,每当Python发现客户端代码中的str(x),则将该表达式转换为特殊方法调用x.__str__()。因而,要重载内置函数str(),则只需包含特殊方法__str__()的一种实现即可。

2. 算术运算符

在Python语言中,算术运算符(如x + y和x * y)不仅仅用于整数和浮点数。Python将每个算术运算符与一个特殊方法关联起来,所以可以通过实现对应的特殊方法,重载任何算术运算符。算术运算符特殊方法的详细信息请参见表3-3-7。

表3-3-7 算术运算符的特殊方法

注:Python 2使用__div__以替代__truediv__。

3. 等性运算符

用于测试相等与否的运算符==和!=值得特别注意。例如,考虑如图3-3-5所示的代码,代码创建了两个Charge对象,被三个变量c1、c2和c3引用。如图3-3-5所示,c1和c3引用一个相同的对象,c2则引用不同的对象。很显然,c1 ...

Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.