python_魔法方法(二):算术运算

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

>>> type(len)
<class ‘builtin_function_or_method‘>
>>> type(int)
<class ‘type‘>
>>> type(dir)
<class ‘builtin_function_or_method‘>
>>> type(list)
<class ‘type‘>

在来看一个例子

>>> class C():
    pass

>>> type(C)
<class ‘type‘>

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

>>> type(C)
<class ‘type‘>
>>> a = int(‘123‘)
>>> b = int(‘456‘)
>>> a + b
579

由此可以看出,对象是可以计算的。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)

举个例子

>>> 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(3)
>>> b = New_int(5)
>>> a
3
>>> b
5
>>> a + b
-2
>>> a - b
8

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

>>> class  Try_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 "<pyshell#44>", line 1, in <module>
    a + b
  File "<pyshell#41>", line 3, in __add__
    return self + other
  File "<pyshell#41>", line 3, in __add__
    return self + other
  File "<pyshell#41>", line 3, in __add__
    return self + other
  [Previous line repeated 327 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

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

>>> 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(1)
>>> b = Try_int(2)
>>> a + b
3

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

1 class Nint(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

时间: 2024-11-05 17:24:38

python_魔法方法(二):算术运算的相关文章

python_魔法方法(一):构造和析构

魔法方法总是被双下划线包围,例如:__init__() 魔法方法是面向对象的python的一切,它的魔力体现在总能在合适的时候调用. 先来介绍析构和构造的三个魔法方法: __init__():构造方法,类在实例化成对象的时候会首先调用这个方法(可选)__new__():才是在一个对象实例化的时候所调用的一个方法,与其他魔方方法不同,它的第一个参数是cls(类),其他参数会传给__init__()__del__():如果说__init__()和__new__()是对象的构造器话,__del__()

python_魔法方法(三):__str__()和__repr__()

使用python的魔法方法和time模块定制一个计时器的类 1.用time模块里的localtime()方法获取时间2.time.localtime返回struct_time格式3.表现你的类:__str__()和__repr__()先来看下__str__()和__repr__()魔法方法 >>> class A(): def __str__(self): return "我在学习python" >>> a = A() >>> pr

python语法学习第十天--魔法方法

魔法方法二!!! 属性访问:在对属性任何操作时,都会调用   有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(self, name) 定义当该类的属性被访问时的行为 __setattr__(self, name, value) 定义当一个属性被设置时的行为 __delattr__(self, name) 定义当一个属性被删除时的行为 __dir__(self) 定义当 dir() 被调用时的行为 __get_

042魔法方法:算术运算

自python2.2以后,对类和类型进行了统一,   做法就是将int(),float(),str(),list(),tuple()转为工厂函数   工厂函数:就是一个对象,当你调用它们的时候,事实上就是创建一个相应的实例对象   如:>>>a = int('123')       >>>b = int('456')       >>>a + b       579       a和b是工厂函数(类对象),int的实例对象       对象a和b相加的

python_面向对象魔法方法指南

原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://github.com/RafeKettler/magicmethods Contents (译)Python魔法方法指南 简介 构造方法 操作符 比较操作符 数值操作符 一元操作符 常见算数操作符 反射算数运算符 增强赋值运算符 类型转换操作符 类的表示 访问控制 自定义序列 预备知识 容器背后的魔法方

python3 与dict相关的魔法方法。使用于二叉搜索树的类中

Python的魔术方法一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__. __setitem__(subscriptable所需method), __delitem__(del obj[key]所需method), __len__(len(…)所需method)等. 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟.

python魔法方法-比较相关

在python2.x的版本中,支持不同类型的比较,其比较原则如下: 内置类型: 1.同一类型: 1.1)数字类型:包含int.float.long.complex.bool(bool类型是int的子类,且True=1, False=0).就按照数字的大小进行比较,例如:   1.2)非数字类型:1.2.1)如果类型中定义了如__cmp__.__gt__等魔法方法,就按照其魔法方法的返回值进行比较,具体如何就是这篇文章接下来要讨论的内容.  1.2.2)如果没有定义上述的魔法方法,就按照 id 函

Python3 魔法方法:算数运算

1.算数运算的魔法方法 在调用相应的运算符时会自动调用相应的魔法方法 比如a和b相加时(a+b)会自动调用a的__add__魔法方法进行加法操作 如果在a中找不到__add__方法python就会到b中寻找反运算的魔法方法__radd__ 2.如何在子类中调用父类的方法 使用super函数 class A: def a(self): print('正在调用A的方法') #AA=A class B(A): def b(self): print('正在调用B的方法') #super().a() su

课时44:魔法方法:简单定制

目录: 一.简单定制 二.课时44课后习题及答案 **************** 一.简单定制 **************** 基本要求:1>> 定制一个计时器的类2>> start和stop方法代表启动计时和停止计时3>> 假设计时器对象t1,print(t1)和直接调用t1均显示结果4>> 当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示5>> 两个计时器对象可以进行相加:t1 + t26>> 只能使用提供的有限