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:
def __init__(self, value):
self.value = value
self.rate = 1 # 与美元的汇率


class Rmb:
def __init__(self, value):
self.value = value
self.rate = 0.1431 # 1元人民币等于0.1431美元


d = Dollar(0.95)
r = Rmb(6.7)

现在请你写代码来判断d是否比r大,在不使用运算符重载的情况下,只能这样来写

d = Dollar(0.95)
r = Rmb(6.7)

def ge(dollar, rmb):
return dollar.value > rmb.value*rmb.rate

print(ge(d, r))

你不可以直接用表达式 d > r来进行判断,因为这样比较的是两个对象的内存地址。编写一个函数来判断两个货币的大小虽然在技术上可行,但从工程上看,着实是一种丑陋的办法。现在,我通过重载__gt__方法来实现两个对象的比较,为了完成这个事情,还需要做一些额外的操作,让这两种货币拥有共同的父类

class Money:
def __init__(self, value):
self.value = value

def __gt__(self, other):
return self.value*self.rate > other.value*other.rate


class Dollar(Money):
def __init__(self, value):
super().__init__(value)
self.rate = 1 # 与美元的汇率


class Rmb(Money):
def __init__(self, value):
super().__init__(value)
self.rate = 0.1431 # 1元人民币等于0.1431美元


d = Dollar(0.95)
r = Rmb(6.7)

print(d > r)

只需要在父类中重载__gt__方法,就可以直接使用 > 运算符比较d 和 r的大小,这比编写一个函数要简单方便的多。