python面向对象–运算符重载
下表是常见的运算符重载方法说明
| 方法名 | 重载说明 | 运算符调用方式 |
|---|---|---|
| init | 构造函数 | 对象创建: X = Class(args) |
| del | 析构函数 | X对象收回 |
| add/sub | 加减运算 | X+Y, X+=Y/X-Y, X-=Y |
| or | 运算符| | X|Y, X|=Y |
| repr_/str | 打印/转换 | print(X)、repr(X)/str(X) |
| call | 函数调用 | X(*args, **kwargs) |
| getattr | 属性引用 | X.undefined |
| setattr | 属性赋值 | X.any=value |
| delattr | 属性删除 | del X.any |
| getattribute | 属性获取 | X.any |
| getitem | 索引运算 | X[key],X[i:j] |
| setitem | 索引赋值 | X[key],X[i:j]=sequence |
| delitem | 索引和分片删除 | del X[key],del X[i:j] |
| len | 长度 | len(X) |
| bool | 布尔测试 | bool(X) |
| lt, gt,le, ge,eq, ne | 特定的比较 | 依次为X<Y,X>Y,X<=Y,X>=Y,X==Y,X!=Y注释:(lt: less than, gt: greater than,le: less equal, ge: greater equal,eq: equal, ne: not equal) |
| radd | 右侧加法 | other+X |
| iadd | 实地(增强的)加法 | X+=Y(or else add) |
| iter, next | 迭代 | I=iter(X), next() |
| contains | 成员关系测试 | item in X(X为任何可迭代对象) |
| index | 整数值 | hex(X), bin(X), oct(X) |
| enter, exit | 环境管理器 | with obj as var: |
| get, set,delete | 描述符属性 | X.attr, X.attr=value, del X.attr |
| new | 创建 | 在__init__之前创建对象 |
接下来,以比较运算符来阐述运算符比较的意义和必要性。
美元与人民币
定义两个类
class Dollar: |
现在请你写代码来判断d是否比r大,在不使用运算符重载的情况下,只能这样来写
d = Dollar(0.95) |
你不可以直接用表达式 d > r来进行判断,因为这样比较的是两个对象的内存地址。编写一个函数来判断两个货币的大小虽然在技术上可行,但从工程上看,着实是一种丑陋的办法。现在,我通过重载__gt__方法来实现两个对象的比较,为了完成这个事情,还需要做一些额外的操作,让这两种货币拥有共同的父类
class Money: |
只需要在父类中重载__gt__方法,就可以直接使用 > 运算符比较d 和 r的大小,这比编写一个函数要简单方便的多。