iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >课时42:魔法方法:算术运算
  • 203
分享到

课时42:魔法方法:算术运算

算术课时方法 2023-01-30 22:01:39 203人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录:   一、算术运算符   二、课时41课后习题及答案    现在来讲一个新名词:工厂函数。python2.2以后,对类和类型进行了统一,做法就是将int()、float()、str()、list()、tuple()这些BIF转换为工

目录:

  一、算术运算符

  二、课时41课后习题及答案

 

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

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

看到没有,普通的BIF应该是<class 'builtin_function_or_method'>,而工厂函数则是<class 'type'>。大家有没有觉得<class 'type'>很眼熟,没错啦,如果定义一个类:

 

>>> class C:
    pass

>>> type(C)
<class 'type'>

 

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

>>> a = int('123')
>>> b = int('345')
>>> a + b
468

现在你是不是豁然发现:原来对象是可以进行计算的!其实你早该发现这个问题了,Python中无处不对象,当在求a + b等于多少的时候,事实上Python就是在将两个对象进行相加操作。Python的魔法方法还提供了自定义对象的数值处理,通过下面这些魔法方法的重写,可以自定义任何对象间的算术运算。

 

 

******************

一、算术运算符

******************

 表中列举了算术运算相关的魔法方法。

__add__(self, other)                   定义加法的行为:+
__sub__(self, other)                   定义减法的行为:-
__mul__(self, other)                   定义乘法的行为:*
__truediv__(self, other)               定义真除法的行为:/
__floordiv__(self, other)              定义整数除法的行为://
__mod__(self, other)                   定义取模算法的行为:%
__divmod__(self, other)                定义当被 divmod() 调用时的行为
__pow__(self, other[, modulo])         定义当被 power() 调用或 ** 运算时的行为
__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(3)
>>> b = New_int(5)
>>> a + b
-2
>>> a - b
8

倘若你想自己写代码,不想通过调用Python默认的方案行不行?答案是肯定的,但是要格外小心。

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

    
>>> a = Try_int(1)
>>> b = Try_int(3)
>>> a + b
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    a + b
  File "<pyshell#48>", line 3, in __add__
    return self + other
  File "<pyshell#48>", line 3, in __add__
    return self + other
  File "<pyshell#48>", line 3, in __add__
    return self + other
  [Previous line repeated 990 more times]
RecursionError: maximum recursion depth exceeded

为什么会陷入无限递归呢?问题出在这里:

def __add__(self,other):
        return self + other

当对象涉及加法操作时,自动调用魔法方法__add__(),但看看上边的魔法方法写的是什么?写的是return self + other,也就是返回对象本身加另外一个对象,这不就又自动触发调用__add__()方法了吗?这样就形成了无限递归。所以,要像下面这样写就不会触发无限递归了:

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

    
>>> a = New_int(1)
>>> b = New_int(3)
>>> a + b
4

当对象进行相关的算术运算,自然而然就会自动触发对应的魔法方法。

通过对魔法方法的重写,你完全可以让Python根据你的意愿去执行:

>>> class int(int):
    def __add__(self,other):
        return int.__sub__(self,other)

    
>>> a = int('5')
>>> b = int('3')
>>> a + b
2

当然,这样做在逻辑上是说不过去的...... emmmm

 

*******************************

二、课时41课后习题及答案

*******************************

 

--结束END--

本文标题: 课时42:魔法方法:算术运算

本文链接: https://www.lsjlt.com/news/179381.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 课时42:魔法方法:算术运算
    目录:   一、算术运算符   二、课时41课后习题及答案    现在来讲一个新名词:工厂函数。Python2.2以后,对类和类型进行了统一,做法就是将int()、float()、str()、list()、tuple()这些BIF转换为工...
    99+
    2023-01-30
    算术 课时 方法
  • 课时43:魔法方法:算术运算2
    目录:   一、反运算   二、增量赋值运算   三、一元操作符   四、课时43课后习题及答案   ************* 一、反运算 ************* 下表列举了反运算相关的魔法方法: __radd__(self, o...
    99+
    2023-01-30
    算术 课时 方法
  • 课时49:魔法方法:生成器
    目录:   一、生成器   二、课时49课后习题及答案   ********************* 一、生成器 ********************** 生成器的学习并不涉及魔法方法,甚至它巧妙地避开了类和对象,仅通过普通地函数就...
    99+
    2023-01-30
    生成器 课时 方法
  • 课时44:魔法方法:简单定制
    目录:   一、简单定制   二、课时44课后习题及答案   **************** 一、简单定制 **************** 基本要求:1>> 定制一个计时器的类2>> start和stop方法代...
    99+
    2023-01-30
    课时 简单 方法
  • 课时47:魔法方法:定制序列
    目录:  一、定制序列   二、课时47课后习题及答案   **************** 一、定制序列 **************** 本节要谈的是定制容器,要想成功的实现容器的定制,便需要先谈一谈协议。协议是什么? 协议(Prot...
    99+
    2023-01-30
    课时 序列 方法
  • 课时41:魔法方法:构造和析构
    目录:   一、_ _init_ _(self[, ...])   二、_ _new_ _(cls[, ...])   三、_ _del_ _(self)   四、课时41课后习题及答案   说的那么厉害,那什么是魔法方法呢? (1)魔法...
    99+
    2023-01-30
    课时 方法 魔法
  • Shell时间运算及时间差的计算方法
    本篇内容主要讲解“Shell时间运算及时间差的计算方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Shell时间运算及时间差的计算方法”吧!一、时间加减这里处理方法,是将基础的时间转变为时间戳...
    99+
    2023-06-09
  • JavaScript中有哪些魔法运算符
    JavaScript中有哪些魔法运算符?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。javascript是一种什么语言javascript是一种动态类型、弱类型的语言,基于...
    99+
    2023-06-14
  • javascript如何实现算术加法运算
    这篇文章主要介绍“javascript如何实现算术加法运算”,在日常操作中,相信很多人在javascript如何实现算术加法运算问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • JavaScript中时间戳运算的方法
    这篇文章主要讲解了“JavaScript中时间戳运算的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中时间戳运算的方法”吧! ...
    99+
    2024-04-02
  • 如何分析Shell时间运算以及时间差计算方法
    这篇文章的内容主要围绕如何分析Shell时间运算以及时间差计算方法进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!最近一段时间,在处理Shell 脚本...
    99+
    2023-06-28
  • python缩进式编码+算术运算符+定义与赋值的方法
    本篇内容介绍了“python缩进式编码+算术运算符+定义与赋值的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、缩进式编码解释型:没有...
    99+
    2023-06-30
  • 揭秘 ASP DataPager 的魔力:分页算法的艺术
    ASP DataPager 控件允许开发人员将数据列表或数据集分页为更易于管理的页面大小。它执行此操作的机制是基于一个高效的分页算法,该算法可以动态计算数据应如何拆分为页面,并生成所需的导航链接。 分页算法 DataPager 使用称...
    99+
    2024-03-02
    ASP.NET、DataPager、分页、算法、分页算法
  • JS中一些高效的魔法运算符总结
    JavaScript 现在每年都会发一个新版本,里面也会新增一些操作更加便利、高效的运算符。今天我们就来盘点下几个高效的魔法运算符。 1. 可选链运算符 之前当我们想要使用某个结构...
    99+
    2024-04-02
  • Python学习【魔术方法】
    魔术方法 Python中,所有以双下划线“__”包围的方法(即定义在类中的函数)为魔术方法Magic Method。 构造和初始化 在使用classname()创造实例化对象时,会依次执行__new__和__init__两个方法。 __...
    99+
    2023-01-31
    魔术 方法 Python
  • golang除法运算
    Golang 是一种现代化的编程语言,它被设计用于高效地编写并发的程序。它支持各种数据类型和操作符,并提供了丰富的标准库,以便开发者可以更容易地实现自己的应用程序。在 Golang 中,除法运算是非常基本和重要的运算符之一。在本文中,我们将...
    99+
    2023-05-16
  • 【Python】计算程序运行时间的方法总结
    一、第一种方法 利用time包: import timedef test(): start_time = time.time() # 记录程序开始运行时间 s = 0 for i ...
    99+
    2023-09-06
    python
  • javascript中&&运算符与||运算符的使用方法实例
    目录前言&&运算符||运算符||运算符的小demo本章目标案例实践(通过加载json渲染数据)结尾总结前言 在前端开发领域中,&&运算符和||运算符...
    99+
    2024-04-02
  • 在Linux终端中进行算术运算的5种方法分别是什么
    本篇文章为大家展示了在Linux终端中进行算术运算的5种方法分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们将向您展示在Linux终端中进行算术运算的各种有用方法。 在本文结束时,您将学...
    99+
    2023-06-16
  • javascript中&&运算符与||运算符的使用方法
    本篇文章为大家展示了javascript中&&运算符与||运算符的使用方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在前端开发领域中,&&运算符和||运算符是...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作