前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Py测开《实现算术运算》

Py测开《实现算术运算》

作者头像
清菡
发布2022-04-27 19:24:55
3270
发布2022-04-27 19:24:55
举报
文章被收录于专栏:清菡软件测试清菡软件测试

一、什么是算术运算?

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

字符串之间不能用减号:

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

三个列表相加是可以的,三个元组相加也是可以的。

二、那么这个加减乘除,它到底是怎么实现的?

Python中不仅数值之间能相加,字符串、列表、元组之间也能进行,这是怎么实现的?

同类型对象之间使用+号的时候,实际上是触发了__add__魔术方法。

原来这个字符串不可以用减法,自己定义一个让字符串可以实现用减法。

1.实现相加

代码语言:javascript
复制
class MyStr(object):
    pass

    def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
        pass

self 是自身。other 就是个普通的参数,里面传什么它接收的是什么。这个other的意思就是其它的对象。

代码语言:javascript
复制


class MyStr(object):
    def __add__(self, other):#一个对象实现加法的时候,实际上是触发了这个魔术方法。
        print("---触发了add方法---")


s1=MyStr()#创建个对象等于s1。
s2=MyStr()#创建个对象等于s2。

s1+s2#通过这个+号触发了add这个方法。那么+号前面这个对象和后面这个对象,
# 到底是哪个触发了这个方法?

运行结果

通过这个+号触发了add这个方法。那么+号前面这个对象和后面这个对象,到底是哪个触发了这个方法?

是s1触发了这个add方法还是s2触发了这个add方法?

怎么区分呢?来定义个init方法。

代码语言:javascript
复制


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。 实际上是这样的一个流程。

2.实现字符串的减法

假设把data当作字符串。

2.1先实现相加:
代码语言:javascript
复制


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)

运行成功

2.2实现减法:

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

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

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

里面“”是替换成空的:意思就是把s1里面的sssss从sssss111里面去除掉。s2也是同理。

看下s3-s1能不能减:
代码语言:javascript
复制

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.data?

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

这里定义了str方法之后:

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

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

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

加不了啊,不可以连续相加。

这个就是关于算术方法的实现,几乎没有什么地方需要我们去重写这个东西的。主要是要知道魔术方法是怎么触发怎么实现的。掌握加减乘除魔术方法底层的原理。

三、算术运算符对应的魔术方法

__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

除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是算术运算?
  • 二、那么这个加减乘除,它到底是怎么实现的?
    • 1.实现相加
      • 是s1触发了这个add方法还是s2触发了这个add方法?
        • 2.实现字符串的减法
          • 2.1先实现相加:
          • 2.2实现减法:
          • 为什么是other.data?
        • 3.之前看字符串可以三个相加,这里可以吗?
        • 三、算术运算符对应的魔术方法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档