一、什么是算术运算?
加减乘除。字符串之间可以用加号,列表之间可以用加号,元组之间也可以用加号。
![31c5e7142e4cd907978d526beac6e1c4.png](https://img-blog.csdnimg.cn/img_convert/31c5e7142e4cd907978d526beac6e1c4.png)
字符串之间不能用减号:
![e3ce5782d62d32c09be59ea3d0af0457.png](https://img-blog.csdnimg.cn/img_convert/e3ce5782d62d32c09be59ea3d0af0457.png)
三个字符串相加也是可以的:
![75d7a125817385e517749ecb826dc98f.png](https://img-blog.csdnimg.cn/img_convert/75d7a125817385e517749ecb826dc98f.png)
三个列表相加是可以的,三个元组相加也是可以的。
二、那么这个加减乘除,它到底是怎么实现的?
Python中不仅数值之间能相加,字符串、列表、元组之间也能进行,这是怎么实现的?
同类型对象之间使用+号的时候,实际上是触发了__add__
魔术方法。
原来这个字符串不可以用减法,自己定义一个让字符串可以实现用减法。
1.实现相加
class MyStr(object):
pass
def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
pass
self 是自身。other 就是个普通的参数,里面传什么它接收的是什么。这个other的意思就是其它的对象。
class MyStr(object):
def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
print("---触发了add方法---")
s1=MyStr()#创建个对象等于s1。
s2=MyStr()#创建个对象等于s2。
s1+s2#通过这个+号触发了add这个方法。那么+号前面这个对象和后面这个对象,
# 到底是哪个触发了这个方法?
![948e929213d88ed530b5cbe3ea286dd7.png](https://img-blog.csdnimg.cn/img_convert/948e929213d88ed530b5cbe3ea286dd7.png)
通过这个+号触发了add这个方法。那么+号前面这个对象和后面这个对象,到底是哪个触发了这个方法?
是s1触发了这个add方法还是s2触发了这个add方法?
怎么区分呢?来定义个init方法。
class MyStr(object):
def __init__(self,data):
self.data=data
def __str__(self):
return self.data
def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
print("---触发了add方法---")
print("self:",self)
print("other:",other)
s1=MyStr("sssss111")#创建个对象等于s1。
s2=MyStr("sssss222")#创建个对象等于s2。
s1+s2#通过这个+号触发了add这个方法。那么+号前面这个对象和后面这个对象,
# 到底是哪个触发了这个方法?
![1541c5d071428f0c38d60cc4388062f3.png](https://img-blog.csdnimg.cn/img_convert/1541c5d071428f0c38d60cc4388062f3.png)
self是s1。s1触发这个add方法,然后把s2这个对象当作一个参数传到add这个方法里面来。
那么这个self是s1,然后通过+号触发魔术方法,把s2当作参数传进来到other。 实际上是这样的一个流程。
2.实现字符串的减法
假设把data当作字符串。
2.1先实现相加:
class MyStr(object):
def __init__(self,data):
self.data=data
def __str__(self):
return self.data
def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
return self.data+other.data
s1=MyStr("sssss111")#创建个对象等于s1。
s2=MyStr("sssss222")#创建个对象等于s2。
print(s1)
print(s2)
print(s1+s2)
![7bc591c275840f62493eac8c875633f9.png](https://img-blog.csdnimg.cn/img_convert/7bc591c275840f62493eac8c875633f9.png)
2.2实现减法:
在这里不能直接用减法,因为字符串减不了,需要用replace
替换一下。
print(s1+s2)
运行结果是ssss111ssss222这样一串字符串。要把字符串转换成MyStr
类里面的一个类型。
![8ce3c787945775ecdb500fae1a7b71fb.png](https://img-blog.csdnimg.cn/img_convert/8ce3c787945775ecdb500fae1a7b71fb.png)
定义了str方法,other.data
就直接可以写成other 了。
![f90efeadd035013249dc5e7a422d0ef3.png](https://img-blog.csdnimg.cn/img_convert/f90efeadd035013249dc5e7a422d0ef3.png)
里面“”是替换成空的:意思就是把s1里面的sssss从sssss111里面去除掉。s2也是同理。
看下s3-s1能不能减:
class MyStr(object):
def __init__(self,data):
self.data=data
def __str__(self):
return self.data
def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
return self.data+other.data
def __sub__(self, other):
return self.data.replace(other.data,"")#在这里不能直接用减法,因为字符串减不了,需要用replace替换一下。
s1=MyStr("sssss111")#创建个对象等于s1。
s2=MyStr("sssss2222")#创建个对象等于s2。
print(s1)
print(s2)
s3=MyStr(s1+s2) #把字符串转换成MyStr类里面的一个类型。
print(s3-s1)
![5d8f74621b4542a28739db6dcee94173.png](https://img-blog.csdnimg.cn/img_convert/5d8f74621b4542a28739db6dcee94173.png)
减号前面是第一个参数self传进来,减号后面是第二个参数other传进来。这个是土方法,成功相减了。这个方法不推荐使用。
为什么是other.data?
other是个对象,去获取这个数据:
![567050836748414da30695411b6aac5d.png](https://img-blog.csdnimg.cn/img_convert/567050836748414da30695411b6aac5d.png)
这里定义了str方法之后:
![9d37a8d922479990bdeb56325b7b9d4f.png](https://img-blog.csdnimg.cn/img_convert/9d37a8d922479990bdeb56325b7b9d4f.png)
str方法返回的是self.data
,其实这里的data可以省略掉的:
![100c3cbecb11440567bd5b55f8f1132f.png](https://img-blog.csdnimg.cn/img_convert/100c3cbecb11440567bd5b55f8f1132f.png)
other.data
中的other就是后面传进来的这个对象s2。它的data就是self.data
,other.data
就等于data,就是我们的data。就等于sssss2222这个数据。
3.之前看字符串可以三个相加,这里可以吗?
![b6636e352592abe78818c8ae1783e8e4.png](https://img-blog.csdnimg.cn/img_convert/b6636e352592abe78818c8ae1783e8e4.png)
加不了啊,不可以连续相加。
这个就是关于算术方法的实现,几乎没有什么地方需要我们去重写这个东西的。主要是要知道魔术方法是怎么触发怎么实现的。掌握加减乘除魔术方法底层的原理。
三、算术运算符对应的魔术方法
__add__(self,other) 定义加法的行为:+
__sub__(self,other) 定义减法的行为:-
__mul__(self,other) 定义乘法的行为:*
__truediv__(self,other) 定义真除法的行为:/
__floordiv__(self,other) 定义整数除法的行为://
__mod__(self,other) 定义取余算法的行为:%
更多的魔术方法参考地址:https://www.cnblogs.com/nmb-musen/p/10861536.html
除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。
公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 166+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。