python2.2之后,对类和类型做了同意,将int()、float()、str()、list()、touple()这些BIF转换为工厂函数

>>>type(len)

>>>type(int)

>>>type(dir)

>>>type(list)

在来看一个例子

>>> classC():pass

>>>type(C)

它的类型是type类型,也是类对象,其实所谓的工厂函数,就是一个类对象,当你调用他们的时候,实际上就是创建一个实例对象:

>>>type(C)

>>> a = int(‘123‘)>>> b = int(‘456‘)>>> a +b579

由此可以看出,对象是可以计算的。python中无处不对象,当在求a+b等于多少的时候,事实上python就是将两个对象进行相加操作。python的魔法方法还体统了自定义对象的数值处理,通过对下面这些魔法方法的重写,可以自定义任何对象间的算术运算。

1、运算和反运算

运算 反运算__add__(self,other):定义加法行为 __radd__(self,other)__sub__(self,other):减法行为 __rsub__(self,other)__mul__(self,other):乘法行为 __rmul__(self,other)__truediv__(self,other):除法行为 __rtruediv__(self,other)__floordiv__(self,other):整除// __rfloordiv__(self,other)__mod__(self,other):取模行为% __rmod__(self,other)__divmod__(self,other):定义当被divmod()调用时行为 __rdivmod__(self,other)__pow__(self,other):乘方** __rpow__(self,other)__rshift__(self,other)和__lshift__(self,other):左移位<<和右移位>> __rrshift__(self,other)和__rlshift__(self,other)__and__(self,other):按位与& __rand__(self,other)__xor__(self,other):按位或^ __rxor__(self,other)__or__(self,other):按位或操作的行为 __ror__(self,other)

举个例子

>>> classNew_int(int):def __add__(self,other):return int.__sub__(self,other)def __sub__(self,other):return int.__add__(self,other)>>> a = New_int(3)>>> b = New_int(5)>>>a3

>>>b5

>>> a +b-2

>>> a -b8

这里用了python默认的方法,如果自己定义了,尝试一下就会发现错误

>>> classTry_int(int):def __add__(self,other):return self +other #出现了无限递归,主要原因在于:对象涉及加法操作,自动调用了魔法方法__add__(),返回return self+other也就是对象本身加另一个对象,形成了无限递归def __sub__(self,other):return self -other>>> a = Try_int(1)>>> b = Try_int(2)>>> a +b

Traceback (most recent call last):

File"", line 1, in a+b

File"", line 3, in __add__

return self +other

File"", line 3, in __add__

return self +other

File"", line 3, in __add__

return self +other

[Previous line repeated327more times]

RecursionError: maximum recursion depth exceededwhile calling a Python object

上面例子可以修改下,就不会出现无限递归了

>>> classTry_int(int):def __add__(self,other):return int(self) +int(other)def __sub__(self,other):return int(self) -int(other)>>> a = Try_int(1)>>> b = Try_int(2)>>> a +b3

关于反运算我这里举一个例子,

1 classNint(int):2 def __radd__(self, other):3 return int.__sub__(self,other)4

5 c = Nint(5)6 d = Nint(3)7 print(a+b) #-2

所以在重写反运算魔法方法的时候,一定要注意顺序问题。

2、增量赋值运算

python也有大量的魔法方法可以定制增量赋值语句,增量赋值其实就是一种能偷懒的形式,它将操作符与赋值的形式结合起来,例如

>>> a = a + b #一般形式

>>> a += b #协成增量赋值的形式

3、一元操作符

一元操作符就是只有一个操作数的意思,像a+b这样,加号左右有a.b两个操作数,叫做二元操作符。只有一个操作数的,例如把剑豪放在一个操作数的前边,就是取这个操作数的相反数的意思,这个时候管它叫负号。

python支持的一元操作符主要有__neg__()(表示正号),__pos__()(定义负号),__abs__()(定义当被__abs__()调用时取绝对值的意思),__nver__()(定义按位取反)

原文地址:https://www.cnblogs.com/pinpin/p/9904695.html

python魔法方法_python_魔法方法(二):算术运算相关推荐

  1. Python的面向对象(二):Python中神奇的魔法方法

    魔法方法 Python里面有一种特殊的方法,叫做魔法方法.Python的类里提供的,是由两个下划线开始,再以两个下划线结束的方法. 魔法方法不需要手动调用,会在恰当的时候就会被激活,自动执行. 魔法方 ...

  2. 小甲鱼Python学习笔记之魔法方法

    什么是魔法方法 构造和析构 __init__方法 __new__方法 __del__方法 工厂函数 通过对魔法方法的重写,还可以自定义对象间的算术运算 反运算方法 实现一个计时器的类 time模块的l ...

  3. python __reduce__魔法方法_Python魔法方法指南

    (译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法" ...

  4. python魔法方法和普通方法_Python魔法方法之属性访问详解!

    练习要求: 写一个矩形类,默认有宽和高两个属性. 如果为一个叫square的属性赋值赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长. 技术分析 我们先来看看有关于属性的四个 ...

  5. python中的魔法方法__new___Python魔法方法会调用new方法吗?

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明:一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修 ...

  6. python魔法方法_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  7. python魔法方法和普通方法_Python龙珠训练营九:魔法方法

    魔法方法总是被双下划线包围,例如 __init__ . 魔法方法是面向对象的 Python 的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的 Python 的强大. 魔法方法的"魔 ...

  8. python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)

    python无处不对象的深刻理解 前面写了这么多,我觉得有必要从一个大的层面,也就是OO来看问题的本质.只要你调用对象的语法是合乎python的习惯的,那就是可以的,我们以前从来没有像下面这么写过,对 ...

  9. Python学习笔记Task11.魔法方法

    Python学习笔记Task11.魔法方法 魔法方法格式__init__ 1.基本 init(self[,-]) new(cls[,-]) del(self) str(self) repr(self) ...

最新文章

  1. 冲刺One之站立会议8 /2015-5-21
  2. python与excel结合能做什么-Python网络爬虫与文本数据分析
  3. plsql存过声明游标_plsql编程学习之游标一
  4. 8-4:C++继承之子类的默认构造函数如何使用
  5. Android 开发常见错误
  6. 2020 JUSTCTF F@k3 0ff1c@l REVERSE WP
  7. OpenGL及GLUT---------------函数整理
  8. 八皇后问题python_八皇后问题 Python实现
  9. 新一届亚马逊研究奖公布!陈怡然、陈丹琦、杨笛一、吴佳俊等华人学者入选
  10. 基于ResNet的MSTAR数据集目标分类
  11. 昨天看《天使爱美丽》
  12. 这三款软件让你轻松实现在线扫花识别植物
  13. 快过年了,该买回家的票了,自动抢票之 12306 抢票篇
  14. 程序员必备利器:8 款“珍藏已久”的程序开发利器,瞬间提升效率
  15. 前端基础知识第四章---CSS
  16. 2021年终总结暨2022年计划安排
  17. kotlin——观察者模式
  18. 除了这门升级中的V2Pro课程,恐怕你找不到更好的学验证的途径了
  19. 2013年华北五省计算机应用大赛,我校学生在华北五省计算机应用大赛获得佳绩...
  20. python-对水平和垂直投影图做曲线拟合

热门文章

  1. Java到底是不是值传递
  2. python中的模块与类
  3. einsum爱因斯坦求和(numpy)
  4. Mac上Java开发环境配置
  5. 如何在参考文献中优雅地引用URL?How do you get nicely formatted URLs in the bibliography?
  6. GraphX主要的接口详解
  7. 静态 static关键字
  8. python怎么设置回文数_python如何写一个函数判断回文数?
  9. 什么是静态,静态有什么作用呢?
  10. python将txt读入矩阵_Python3 把txt数据文件读入到矩阵中