小伙伴们看到这个题目应该有一丝丝的疑惑,一般不都是数字做运算吗?怎么,两个对象也可以放到一起做运算吗?那可不,今天,我们就一起来看看怎么让两个对象做运算。在这里,我们要使用一个非常强大的功能,叫做运算符重载。
什么是运算符重载呢?要解释这个,我们先要来看一下什么是运算符、
运算符,顾名思义,就是用于运算的符号。Python中的运算符有算术操作符、比较操作符、逻辑操作符等等,想要详细的小伙伴,可以参考我们之前的文章,Python中的运算符。一般这些运算符都是用于数学运算,这个小伙伴们应该很熟悉啦,比如下面这个例子。
我们说过,Python中一切皆为对象。实际上呢,这里的a和b都是int类型的,也就是说它们是int类的实例。
而这里我们看到的运算符,加号,减号,乘号,是由int类中的内置方法__add__,__sub__,__mul__等决定的,这些函数决定了我们在使用运算符时的具体操作。同样,在double、complex等数字类型中也是有这些内置函数的。
那么,在一个我们自己定义的类里面,一旦我们定义好了这些函数,能不能实现自定义类的加减乘除等运算呢?当然可以~这就是我们说的运算符重载。
所以说,运算符重载,就是说我们自己实现类中与相应运算符对应的内置方法。那么,这些内置方法长什么样呢?我们来看看最常见的算术运算符重载
这里的rhs表示运算符右边的对象,用其它名称也是可以的,看自己的习惯。有小伙伴可能好奇,为什么这里是truediv,真正的除法,这是为了和整除区分开。
我们来看一个简单的例子。
在这里,我们定义了一个Circle类,它只有一个属性就是半径radius。这里我们实现了__add__方法。为了解释运算符重载的最用,我们做了一个有意思的假定:两个圆加在一起是它们的面积相加。这里我们用到了一点点数学知识,第7行到第10行,我们求出两个圆的面积,把它们加起来得到新圆的面积,然后再求出新圆的半径。这就是我们定义的加法运算符。
我们也重载了__str__方法,这样我们在打印Circle类的实例时,可以按照第13行的格式输出。
小伙伴们看看结果,一个半径为5的圆和一个半径为6的圆,加到一起,得到了一个半径为7.81的圆。
这就是运算符重载的作用:让我们可以按照自己的想法去实现自定义类型的各种运算操作,让程序更加简洁易读。
这时候有小伙伴们可能就好奇了,两个对象做运算,必须是同一个类型的对象吗?
这个也不一定,右边的rhs也可以是别的类型。但是大多时候都是一样的类型,因为这时候的含义比较明确,就是两个同一自定义类型的运算。
如果想要尝试不同类型的话,运算符对应的内置方法必须要做好类型的处理,不然会报错。
比如我们想通过乘法让圆的半径加3,直接new_circle=circle1+3就会报错。
那这时候可以怎么办呢?我们需要在__add__方法中对rhs的类型进行判断,然后处理
当rhs类型是Circle的时候,和之前的处理一样,当rhs类型是int或者float的时候,直接给半径加上对应的数。我们来看看结果
这样就可以正常给圆加上一个半径值了。
所以说,在使用运算符重载的时候,一定要正确编写对应内置方法的代码,不然很容易报错哦~
结束语
今天给小伙伴们介绍了Python中的运算符重载,这是一个非常实用的功能,通过在类中定义运算符重载,我们展现在外部的代码可以更加简洁,程序的易读性也大大增强,所以,快点动手学起来吧~