Python面向对象运算符重载

运算符重载的概念如下:

运算符重载让类拦截常规的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__

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/74e45e6e41b50d84cfbb50b978eae5cd.html