1.可以对原有的类进行修改覆盖
>>> class int(int):
def __add__(self,other):
return int.__sub__(self,other)
>>> a = int('5')
>>> a
5
>>> b = int('3')
>>> a + b
2
2.反运算
比如说 a + b
当a不支持进行加法运算或没有实现时(比如说实际的数字1,2,3),就会实行b的反运算.
>>> class nint(int):
def __radd__(self,other):
return int.__sub__(self,other)
>>> a = nint(5)
>>> b = nint(3)
>>> a + b
8
>>> 1 + b '''因为1是一个数字,而不是一个实例对象,所以不支持加法运算,所以就会调用b的反运算'''
2 '''此处重写使它变为减法是为了好理解'''
>>> class nint(int):
def __rsub__(self,other):
return int.__sub__(self,other) '''此处是修改原函数之后的'''
>>> a = nint(5)
>>> 3 - a
2
>>> class nint(int):
def __rsub__(self,other):
return int.__sub__(other,self) '''此处为原函数'''
>>> a = nint(5)
>>> 3 - a
-2
3.增量赋值运算
如 += ,-=。
4.一元操作符
只有一个操作数时
如 -(取相反数),abs()(取绝对值)等。
以上所有方法都可以重写,DIY。
定义一个类 Nstr,当该类的实例对象间发生的加、减、乘、除运算时,将该对象的所有字符串的 ASCII 码之和进行计算:
方法一
>>> class Nstr:
def __init__(self,arg=''):
if isinstance(arg,str): #判断传入的值是不是字符串
self.count = 0
for i in arg:
self.count += ord(i)
else:
print('参数错误!')
def __add__(self,other):
return self.count + other.count
def __sub__(self,other):
return self.count - other.count
def __mul__(self,other):
return self.count * self.count
def __truediv__(self,other):
return self.count / other.count
def __floordiv__(self,other):
return self.count // other.count
>>> a = Nstr('lubenwei')
>>> b = Nstr('niubi')
>>> a + b
1394
>>> a - b
324
>>> a * b
737881
>>> a / b
1.605607476635514
>>> a // b
1
方法2:
>>> class Nstr(int):
def __new__(cls,arg=0): #在对象实例被创建的一刻执行
if isinstance(arg,str):
count = 0
for each in arg:
count += ord(each)
arg = count
return int.__new__(cls,arg)
>>> a = Nstr('lubenwei')
>>> b = Nstr('niubi')
>>> a + b
1394
>>> a - b
324
>>> a * b
459565
>>> a / b
1.605607476635514
>>> a // b
1