运算符重载的概念如下:
运算符重载让类拦截常规的Python运算;
类可重载所有Python表达式运算符;
类也可重载打印、函数调用、属性点号运算等内置运算;
重载是类实例的行为想内置类型;
重载是通过提供特殊名称的类方法来实现的;
常见的运算符重载方法 方法重载调用__init__ 构造函数 对象建立:X = Class(args)
__del__ 解析函数 X对象收回
__add__ 运算符+ 如果没有__iadd__,X+Y,X+=Y
__or__ 运算符或 如果没有__ior__
__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],没__iter__时的for循环和其他迭代器
__setitem__ 索引赋值语句 X[key]=value,X[i:k]=sequence
__delitem__ 索引和分片删除 del X[key], del X[i:j]
__len__ 长度 len(X),如果没有__bool__,真值测试
__bool__ 布尔测试 bool(X),真测试
__lt__,__gt__,__le__,__ge__,__eq__,__ne__ 特定的比较 XY…,x>
__radd__ 右侧加法 Other + X
__iadd__ 增强的加法 X += Y
__iter__,__next__ 迭代环境 I=iter(X),next(I)
__contains__ 成员关系测试 item in X(任何可迭代对象)
__index__ 整数值 hex(X),bin(X),oct(X),o[X],O[X:]
__enter__,__exit__ 环境管理器 with obj as var:
__get__,__set__,__delete__ 描述符属性 X.attr,X.attr=Value,del X.attr
__new__ 创建 在__init__之前创建对象
所有重载方法的名称前后都有两个下划线字符,以便把同类中定义的变量名区别开来。
构造函数和表达式:__init__和__sub__
>>> class Number:
... def __init__(self, start):
... self.data = start
... def __sub__(self, other):
... return Number(self.data - other)
...
>>> X = Number(5)
>>> Y = X - 2
>>> Y
<__main__.Number object at 0x10224d550>
>>> Y.data
3
索引和分片: __getitem__和__setitem__基本索引
>>> class Index:
... def __getitem__(self, item):
... return item ** 2
...
>>>
>>> for i in range(5):
... I = Index()
... print(I[i], end=' ')
...
0 1 4 9 16
切片索引
>>> class Index:
... data = [5, 6, 7, 8, 9]
... def __getitem__(self, item):
... print('getitem: ', item)
... return self.data[item]
... def __setitem__(self, key, value):
... self.data[key] = value
...
>>> X = Index()
>>> print(X[1:4])
getitem: slice(1, 4, None)
[6, 7, 8]
>>> X[1:4] = (1, 1, 1)
>>> print(X[1:4])
getitem: slice(1, 4, None)
[1, 1, 1]
索引迭代:__getitem__如果重载了这个方法,for循环每次循环时都会调用类的getitem方法;
>>> class stepper:
... def __getitem__(self, item):
... return self.data[item].upper()
...
>>>
>>> X = stepper()
>>> X.data = 'ansheng'
>>> for item in X:
... print(item)
...
A
N
S
H
E
N
G
迭代器对象:__iter__和__next__
>>> class Squares:
... def __init__(self, start, stop):
... self.value = start - 1
... self.stop = stop
... def __iter__(self):
... return self
... def __next__(self):
... if self.value == self.stop:
... raise StopIteration
... self.value += 1
... return self.value ** 2
...
>>> for i in Squares(1, 5):
... print(i)
...
1
4
9
16
25
成员关系:__contains__、__iter__和__getitem__
class Iters:
def __init__(self, value):
self.data = value
def __getitem__(self, item):
print('get[%s]' % item, end='')
return self.data[item]
def __iter__(self):
print('iter>==', end='')
self.ix = 0
return self
def __next__(self):
print('next:', end='')
if self.ix == len(self.data): raise StopIteration
item = self.data[self.ix]
self.ix += 1
return item
def __contains__(self, item):
print('contains: ', end=' ')
return item in self.data
X = Iters([1, 2, 3, 4, 5])
print(3 in X)
for i in X:
print(i, end='|')
print([i ** 2 for i in X])
print(list(map(bin, X)))
I = iter(X)
while True:
try:
print(next(I), end=' @')
except StopIteration as e:
break
属性引用:__getattr__和__setattr__