专栏首页渗透云笔记算数运算(第十六章)

算数运算(第十六章)

自Python2.2以后,对类和类型进行了同一,做法就是将int(),float(),str(),list()tuple()这些BIF转换为工厂函数

工厂函数

>>> type(len)
<class 'builtin_function_or_method'>
 #len方法用于返回参数的长度

他返回了一句<class 'builtin_function_or_method'>这是个普通的BIF返回的,看一下Int的返回格式

>>> type(int)
<class 'type'>
>>> type(str)
<class 'type'>
>>>

你会发现,它和class(类,撞了衫)如下

>>> class A:
...     pass
...
>>> type(A)
<class 'type'>
>>>

所谓的工厂函数,其实就是个class(类),调用时,其实就是实例化一个对象,如下

>>> a = int("123")
>>> b = int("456")
>>> a + b
579
>>>

算数操作符

列举一些常用的算数运算的魔法方法

魔法方法

含义

__add__(self,other)

定义加法的行为:+

__sub__(self,other)

定义减法行为:-

__mul__(self,other)

定义乘法行为;*

__truediv__(self.other)

定义除法行为://

__mod__(self,other)

定义取模算法行为;%

__divmod__(self,other)

定义当做调用__divmod__时的行为

__pow__(self,other[,,odulo])

定义被当做__pow_-调用或**运算时行为

__lshift__(self,other)

定义按位左移的行为;<<

__rshift__(self,other)

定义按位右移的行为;>>

__and__(self,other)

定义与操作的行为;‘&’

__xor__(self,other)

定义按位异或的行为‘^’

__or__(self,other)

定义按位或的行为‘|’

举个例子

class New_int(int):
     def __add__(self,other):
             return int.__sub__(self,other)
     def __sub__(self,other):
             return int.__add__(self,other)
            源码

运行后

>>> a = New_int(4)
>>> b = New_int(5)
>>> a  +  b
-1
>>> a - b
9

如果自己写代码,不想调用Python的默认方案行吗?

肯定行啊,但是我们可能会疏忽

看下列代码

class Try_int(int):
     def __add__(self,other):
             return selt + other
     def __sub__(self,other):
             return self - other
            

大家不妨找找错

运行后

>>> a = Try_int(4)
>>> b = Try_int(6)
>>> a +b
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    a +b
  File "C:/Users/Administrator/Desktop/__add甲方.py", line 3, in __add__
    return selt + other
NameError: name 'selt' is not defined

程序出现了无限递归的情况,为什么

return selt + other

因为这串代码,当对象涉及到,加法时会调用__add__然后,又加法又调用,形成无限的递归。

怎么改

class Try_int(int):
     def __add__(self,other):
             return int(self) + int(other)
     def __sub__(self,other):
             return int(self) - int(other)
            

运行后

>>> a = Try_int(4)
>>> b = Try_int(6)
>>> a + b
10

本文分享自微信公众号 - 渗透云笔记(shentouyun),作者:天钧

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Webug4.0的Docker版本来了!

    0x01 前言 WeBug名称定义为"我们的漏洞"靶场环境 ,基础环境是基于PHP/mysql制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏...

    天钧
  • 浅谈图形用户界面(第十二章)

    天钧
  • MacOS下的渗透测试工具

    天钧
  • 课时42:魔法方法:算术运算

     现在来讲一个新名词:工厂函数。Python2.2以后,对类和类型进行了统一,做法就是将int()、float()、str()、list()、tuple()这些...

    py3study
  • git基础知识

    git config --global user.email'lirulei90@126.com'

    二狗不要跑
  • 优化网站性能必备的6种架构方案,你知道吗?

    一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的,它是随着用户量的增加,业务功能的扩展逐渐演变完...

    技术zhai
  • 求质数的BitSet算法

    小小明童鞋
  • rz、sz是Linux同Windows进行ZModem文件传输的命令行工具

    要使用rz、sz 命令。需要在系统上安装对应的 lrzsz 软件包 ,要查询是否安装了lrzsz软件包,使用如下命令:

    wuweixiang
  • 优化网站性能必备的6种架构方案,你知道吗?

    一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的,它是随着用户量的增加,业务功能...

    lyb-geek
  • 动态 | 听说 NIPS 2018 门票十分钟卖光,机器学习圈子炸了锅

    AI 科技评论按:全世界都知道人工智能火、机器学习火。具体火到了什么程度呢?昨晚 NIPS2018 的售票情况可谓是最直观、也最惊人的展现了,作为一个研究人员们...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券