Py测开《实现算术运算》

一、什么是算术运算?

加减乘除。字符串之间可以用加号,列表之间可以用加号,元组之间也可以用加号。

31c5e7142e4cd907978d526beac6e1c4.png

字符串之间不能用减号:

e3ce5782d62d32c09be59ea3d0af0457.png

三个字符串相加也是可以的:

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
运行结果

通过这个+号触发了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
运行结果

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
运行成功
2.2实现减法:

在这里不能直接用减法,因为字符串减不了,需要用replace替换一下。

print(s1+s2)运行结果是ssss111ssss222这样一串字符串。要把字符串转换成MyStr类里面的一个类型。

8ce3c787945775ecdb500fae1a7b71fb.png

定义了str方法,other.data就直接可以写成other 了。

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
运行成功

减号前面是第一个参数self传进来,减号后面是第二个参数other传进来。这个是土方法,成功相减了。这个方法不推荐使用。

为什么是other.data?

other是个对象,去获取这个数据:

567050836748414da30695411b6aac5d.png

这里定义了str方法之后:

9d37a8d922479990bdeb56325b7b9d4f.png

str方法返回的是self.data,其实这里的data可以省略掉的:

100c3cbecb11440567bd5b55f8f1132f.png

other.data中的other就是后面传进来的这个对象s2。它的data就是self.dataother.data就等于data,就是我们的data。就等于sssss2222这个数据。

3.之前看字符串可以三个相加,这里可以吗?

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+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值