加减乘除。字符串之间可以用加号,列表之间可以用加号,元组之间也可以用加号。
字符串之间不能用减号:
三个字符串相加也是可以的:
三个列表相加是可以的,三个元组相加也是可以的。
Python中不仅数值之间能相加,字符串、列表、元组之间也能进行,这是怎么实现的?
同类型对象之间使用+号的时候,实际上是触发了__add__
魔术方法。
原来这个字符串不可以用减法,自己定义一个让字符串可以实现用减法。
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这个方法。那么+号前面这个对象和后面这个对象,
# 到底是哪个触发了这个方法?
运行结果
通过这个+号触发了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这个方法。那么+号前面这个对象和后面这个对象,
# 到底是哪个触发了这个方法?
运行结果
self是s1。s1触发这个add方法,然后把s2这个对象当作一个参数传到add这个方法里面来。
那么这个self是s1,然后通过+号触发魔术方法,把s2当作参数传进来到other。 实际上是这样的一个流程。
假设把data当作字符串。
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)
运行成功
在这里不能直接用减法,因为字符串减不了,需要用replace
替换一下。
print(s1+s2)
运行结果是ssss111ssss222这样一串字符串。要把字符串转换成MyStr
类里面的一个类型。
定义了str方法,other.data
就直接可以写成other 了。
里面“”是替换成空的:意思就是把s1里面的sssss从sssss111里面去除掉。s2也是同理。
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)
运行成功
减号前面是第一个参数self传进来,减号后面是第二个参数other传进来。这个是土方法,成功相减了。这个方法不推荐使用。
other是个对象,去获取这个数据:
这里定义了str方法之后:
str方法返回的是self.data
,其实这里的data可以省略掉的:
other.data
中的other就是后面传进来的这个对象s2。它的data就是self.data
,other.data
就等于data,就是我们的data。就等于sssss2222这个数据。
加不了啊,不可以连续相加。
这个就是关于算术方法的实现,几乎没有什么地方需要我们去重写这个东西的。主要是要知道魔术方法是怎么触发怎么实现的。掌握加减乘除魔术方法底层的原理。
__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
除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。