Python 5大常用魔术方法汇总

2023-11-12

前言

Python 中,以双下划线__包起来的方法,统称为:魔术方法(Magic Method)

魔术方法是一个类或对象中的特殊方法,和普通方法的区别在于,普通方法需要手动调用,而魔术方法是在特定时刻自动触发执行的

如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些魔术方法进行重写

五个常用魔术方法

1. __new__

(1). 说明:实例化对象方法

(2). 触发时机:在实例化时触发

(3). 参数:至少得有一个cls接收当前类,写法为__new__(cls, *args, **kwargs)

(4). 返回值:必须使用return关键字返回一个对象实例

(5). 作用:实例化(创建)对象,开辟内存地址空间对象并返回

(6). 注意:实例化对象是Object类底层实现,其他类继承了Object__new__才能够实现实例化对象

2. __init__

(1). 说明:初始化方法,相当于java中的构造方法,在__new__执行后被调用

(2). 触发时机:初始化对象时触发(区别于__new__实例化时的触发)

(3). 参数:至少得有一个self接收__new__方法返回的对象,写法为__init__(self, name, age)

(4). 返回值:无

(5). 作用:初始化对象的成员

(6). 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有

3. __del__

(1). 说明:析构魔术方法

(2). 触发时机:当一块地址空间没有任何指针引用的时候被触发

  • 在 Python 解释器中,当所有代码程序执行完成则会进行垃圾回收,也叫内存释放,这时就会触发__del__方法

  • 使用del 对象名显示删除引用关系时,如果此操作将某块地址空间的最后一个引用关系给删除,则会触发__del__方法

(3). 参数:仅只一个self参数接收对象

(4). 返回值:无

(5). 作用:使用完对象时回收资源,没有指针引用的时候会调用,绝大多数时候不需要重写

(6). 注意:del 对象名不一定会触发当前方法,只有某块地址空间无任何引用时才会触发

4. __call__

(1). 说明:调用对象函数的魔术方法

(2). 触发时机:将对象当作函数调用时触发,使用形式为对象名称(),会默认调用__call__函数里的内容

(3). 参数:至少得有一个self接收对象,剩余参数根据调用时传入的参数决定,写法为__call__(self, args)

(4). 返回值:根据具体重写逻辑而定

(5). 作用:将复杂的步骤统一放在该函数内实现,减少调用的步骤,比较方便

(6). 注意:无

5. __str__

(1). 说明:当print(对象名)时想看到更多的信息时,可以重写__str__方法,将想要输出的信息放在__str__函数中返回

(2). 触发时机:使用print(对象名)或者str(对象名)的时候触发

(3). 参数:一个self参数接收对象

(4). 返回值:必须是字符串类型

(5). 作用:print(对象名)时可以自定义输出更多有用信息

(6). 注意:无

Python 代码

1. 代码实例
class People:  # 类名Person后面加不加(Object)效果是一样的,都表示继承自Object类
    # 创建对象
    def __new__(cls, *args, **kwargs):
        print("调用__new__构造方法")
        position = super().__new__(cls)  # 调用父类的__new__()方法创建对象,开辟内存空间
        # print(position)  # <__main__.People object at 0x7fa19b8a6c10>
        return position  # 将创建的地址空间对象返回,交给__init__方法接收

    # 实例化对象
    def __init__(self, name, age):
        self.name = name  # 在__new__方法返回的内存空间地址中放置name属性
        self.age = age  # 在__new__方法返回的内存空间地址中放置age属性
        # print(self)  # <__main__.People object at 0x7fa19b8a6c10>
        print("调用__init__初始化方法")

    # 对象作为函数调用时的逻辑
    def __call__(self, args):
        print("调用__call__方法,接收到的参数为:%s" % args)

    # 删除对象: 在(del 对象名后所对应的地址空间无任何引用时)或者程序执行结束之后
    def __del__(self):
        print("调用__del__析构方法,删除对象,释放内存空间")

    # 自定义print(对象名)时的输出内容
    def __str__(self):
        return '对象的name是:' + self.name + ',对象的age是:' + str(self.age)


if __name__ == '__main__':
    p = People('liuming', 20)
    # print(p)  # <__main__.People object at 0x7fa19b8a6c10>
    p('abc')  # 调用__call__方法
    p1 = p
    p2 = p
    p3 = p  # 截止到这里p对象所在的地址空间,共有4个对象都在引用,分别是对象:p,p1,p2,p3
    del p3  # 删除的是p3对内存地址空间的引用关系,此时p对象所在的地址空间,共有3个对象在引用,分别是对象:p,p1,p2
    del p2
    del p1
    del p  # 自动调用__del__方法,因为p对象所在的地址空间已经没有任何对象在引用了,所以需要对内存地址进行回收释放
    p4 = People('xiaohong', 18)
    print(p4)  # 对象的name是:xiaohong,对象的age是:18---注意:此时输出的不再是地址空间值了,而是__str__函数自定义return的内容
    print(str(p4))  # 输出内容同print(p4)
2. 结果输出
1.调用__new__构造方法
2.调用__init__初始化方法
3.调用__call__方法,接收到的参数为:abc
4.调用__del__析构方法,删除对象,释放内存空间
5.调用__new__构造方法
6.调用__init__初始化方法
7.对象的name是:xiaohong,对象的age是:18
8.对象的name是:xiaohong,对象的age是:18
9.调用__del__析构方法,删除对象,释放内存空间
3. 代码分析
  1. p = People('liuming', 20)p4 = People('xiaohong', 18)该代码块执行时都会自动调用__new____init__函数,对应结果输出为:第1,2,5,6行

  2. p('abc')该代码块执行时会自动调用__call__函数,对应结果输出为:第3行

  3. del p该代码块执行时会自动调用__del__函数,对应结果输出为:第4行

  • 注意:当执行代码块del p3/p2/p1时都没有自动调用__del__函数

  • 是因为此时p对象所指向的地址空间还有p这个对象在引用,指针引用关系还存在

  • 直到del p执行时才将该地址空间唯一的指针引用关系给销毁了,所以就调用了__del__函数。

  1. print(p4)print(str(p4))该代码块执行时会自动调用__str__函数,对应结果输出为:第7,8行

  2. 所有代码块全部执行完毕后,Python解释器的垃圾回收机制会将分配的内存进行释放回收,此时也会调用__del__函数,对应结果输出为:第9行

欢迎关注 无量测试之道 公众号,回复领取资源

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:无量测试之道

添加关注,让我们一起共同成长!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 5大常用魔术方法汇总 的相关文章

随机推荐

  • 试题:网易笔试的一道题目

    写一个程序 打印出以下的序列 a b c d e z a b a c a d a e a z b c b d b z c d y z a b c a b d a b z a c d x y z a b c d x y z 这道题是从luci
  • mysql通用日志不打印_解决logback不打印mybatis的SQL日志的问题

    工作这么多年 今天还是因为Logback的这个问题稍微卡了一下 惭愧 问题描述 logback配置了如下信息 此处省略File Appender内容 logbase sql d yyyy MM dd log 30 d yyyy MM dd
  • SQL 语句中 where 条件后 写上1=1 是什么意思

    在编程过程中 经常会在代码中使用到 where 1 1 这是为什么呢 SQL注入 初次看到这种写法的同学肯定很纳闷 加不加where 1 1 查询不都一样吗 例如 select from customers 与 select from cu
  • Windows/Linux 部署Nacos遇到的问题及解决方法

    nacos的版本采用的是2 1 2 本片只记录部署过程遇到的问题 不涉及部署过程 Linux遇到的问题 com alibaba nacos core distributed raft exception JRaftException jav
  • C++项目(有注释超详细)

    规范代码 定义函数或者类尽量放到头文件中 这样不容易出现重复命名和代码冗杂的问题 pragma once include
  • 全新的eMPP(Elastic MPP),超越MPP的超弹性架构

    大数据时代 的概念最早由著名咨询公司麦肯锡提出 麦肯锡表示 数据已渗透到今天的每个行业和业务功能领域 并已成为重要的生产要素 数据在精巧的算法中被挖掘 数据分析变得至关重要 大家开始达成一个共识 数据计算 能够找到新发现 博思艾伦咨询公司的
  • 第1174期AI100_机器学习日报(2017-12-05)

    AI100 机器学习日报 2017 12 05 kegra 使用keras通过深度学习构建知识图谱 ChatbotsChina 图数据中的推理 微软亚洲研究院 浅谈NLP中条件语言模型 Conditioned Language Models
  • 第七课:BootRom的烧录

    目录 2 5 烧录BootRom 2 5 1 P2020 e500核 上电启动及boot流程 2 5 2 烧录BootRom到NorFlash 2 5 2 1 CodeWarrior的介绍
  • QT定时器

    QTimer使用 添加头文件 include
  • 推荐一个很适合程序员的副业!

    推荐一个超级赞的副业就是有声书录制 从2013年到现在已经火了9年时间 可谓是源远流长 这个兴趣爱好衍生出来的副业已经承载了上百万小白从业人员 头部主播的年收入都破了百万 有声书录制的发展历程可以概括为 或许曾经混沌 但必定未来可期 判断一
  • windows核心编程-杨波-专题视频课程

    windows核心编程 422人已学习 课程介绍 SDK 软件开发工具包 Software Development Kit SDK 一般是一些被软件工程师用于为特定的软件包 软件框架 硬件平台 作业系统等创建应用软件的开发工具的集合 MFC
  • Go语言基础(一)之函数调用、传参、反射机制、类型断言与转换

    Go语言基础 一 之函数调用 传参 反射机制 1 1 函数调用 package main func myFunction a b int int int return a b a b func main myFunction 66 77 使
  • 观察者模式实践-实现winform 窗体之间传值(事件实现)

    事件本身就是观察者模式的一个实现 先总结一下事件的使用 委托类型声明 定义发布者类 并声明事件 在发布者类中定义触发事件方法 定义订阅者类 并注册事件 在订阅者类中定义事件处理方法 针对事件 Net Framework提供了一个标准模式 主
  • linux epoll 非阻塞,Linux epoll 非阻塞connect

    为什么需要非阻塞connect 建立当前连接与其浪费等待 不如同时做些其它有意义的工作 可以异步建立多个连接 可以借助select epoll等系统调用设置合适的连接超时 而阻塞情况下只得等待默认的超时 网络上的文章大多是使用select来
  • PostgreSQL数据库保存图片

    一 postgresql 数据库的安装和配置 主要用到的命令 安装 PostgreSQL sudo apt get update sudo apt get install postgresql postgresql client 安装完毕后
  • 匿名内部类创建线程的两种方式

    我们知道多线程的实现有两种方式 一种是继承Thread类 另一种是实现Runnable接口 然后再重写run方法 最后开启线程 我们在普通的创建线程中 显然是比较麻烦的 那么有没有一个简单的方法呢 今天给大家介绍使用匿名内部类创建线程 为什
  • js逆向系列:企名片,获取js逆向后的真实数据!

    一 进入企名片创业项目 我们需要爬取如下数据 首先 对该网页进行抓包 发现这些数据是通过post请求获得的 这是网站给我们返回的数据 为什么和网页上显示的不一样呢 分析后得出 这是经过js加密后的数据 为了防止爬虫 网页对数据进行了加密 因
  • 没有50W彩礼,该怎么办

    大家好 我是才哥 刚过完春节 作为到了已婚甚至被催婚年龄的我们也开始讨论一个自古既有的话题 彩礼 今天上午 看到朋友圈刷屏了一个B站UP主的视频 没有50W彩礼 女朋友被强行拖走 我该怎么办 看完视频只想说 https www bilibi
  • Android面经_安卓面经(25/30)之MVC、MVP、MVVM全解析

    系列专栏 安卓高频面经解析大全专栏链接 150道安卓高频面试题全解析 安卓高频面经解析大全目录详情 安卓面经 anroid面经 150道安卓常见基础面试题全解析 安卓系统Framework面经专栏 Android系统Framework面试题
  • Python 5大常用魔术方法汇总

    前言 Python 中 以双下划线 包起来的方法 统称为 魔术方法 Magic Method 魔术方法是一个类或对象中的特殊方法 和普通方法的区别在于 普通方法需要手动调用 而魔术方法是在特定时刻自动触发执行的 如果希望根据自己的程序定制自