零基础入门学习Python(22):魔法方法(2)算术运算
利用type()函数可以知道某个对象是什么类型:
>>> type(int) #int是类类型
<class 'type'>
>>> a = 2 #定义一个整数a,即a是类类型int的一个对象
>>> type(a)
<class 'int'>
>>> b = 1
>>> a + b #事实上,Python在将两个对象相加
3
Python中,加、减、乘、除、取模、求平方等都有自己的魔法方法,需要时我们也可以重写这些魔法方法。下面举例说明一下,为了区分重写的魔法方法和原来的魔法方法,我们把加法定义为减法,减法定义为加法。
>>> class TestInt(int): #继承int类
def __add__(self,other): #重写加法魔法方法,返回值调用了int的减法魔法方法
return int.__sub__(self,other)
def __sub__(self,other): #重写减法魔法方法,返回值调用了int的加法魔法方法
return int.__add__(self,other)
>>> a = TestInt(2) #生成一个TestInt类的对象并初始化为2
>>> b = TestInt(1)
>>> a + b #先找a的加法方法__add__(),如未找到,则找b的反加法方法__radd__()
1 #结果为1,说明运行a的加法方法时调用了int的减法方法
计算 a + b 时,当 a 的加法操作(add)不能实现或者不支持的时候,Pytnon就会找到 b 的反加法操作(radd)。
>>> class TestRint(int):
def __radd__(self,other): #重写反加法魔法方法,返回值调用了int的加法魔法方法
return int.__sub__(self,other)
>>> c = TestRint(5)
>>> d = TestRint(6)
>>> c + d #c和d都是TestRint类的对象,继承了int类,即可以找到它们各自的加法方法,因为没有重写,所以使用的是int类中的加法魔法方法
11
>>> c + 1 #可以找到对象c的加法方法
6
>>> 1 + c #找不到1的加法方法,就会调用对象c的反加法方法,即重写之后的方法,方法中self指c,other指1,所以得到(5-1)的结果
4
在进行算术运算时,一定要注意操作数的运算顺序,其它算术运算的魔法方法跟加法类似,下面简单举例说明:
>>> a = int(2)
>>> b = int(3)
>>> a.__sub__(b)
-1
>>> a.__mul__(b)
6
>>> a.__floordiv__(b) #除法,向下取整
0
>>> a.__mod__(b) #取模
2
>>> a.__divmod__(b) #返回一个元组:(a//b, a%b)即商和余数
(0, 2)
>>> a.__pow__(b) #求平方
8