如何用Python常用魔术方法阅读源码?13组代码轻松了解!

在看 python 源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由 python 解释器提供的具有特殊意义的方法,主要是 python 源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下划线方法,更有益于我们阅读源码。
今天我们就来看看常用的双下划线方法到底是干什么的。

  1. __init_()

    1、代码演示class Demo:    def __init__(self, name, age):        self.name = name        self.age = age        print("姓名:",self.name)        print("年龄:",self.age)
    if __name__ == '__main__':    cl = Demo("狗子", 22)输出:姓名:狗子年龄:222、总结   1、触发方式,类实例化的时候自动调用。   2、作用,用于创建实例属性。
  2. __new__()

    1、代码演示class Demo:    def __init__(self):        print("如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行")        print("如果不在__new__方法里面调return创建好的对象,__init__不会被执行")    def __new__(cls, *args, **kwargs):        print("__new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法")        return super().__new__(cls,*args,**kwargs)if __name__ == '__main__':    cl = Demo()输出:__new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行如果不在__new__方法里面调return创建好的对象,__init__不会被执行2、总结   1、触发方式,实例化类的时候自动调用。   2、作用,创建类实例。   2、__new__()方法执行顺序在__init()之前。   3、如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行。   4、如果不在__new__方法里面调return创建好的对象,__init__不会被执行。
  3. _call__()

    1、代码演示class Demo:    def __init__(self):        print("初始化方法在类实例化的时候执行")    def __call__(self):        print("将类实例当做函数调用的时候触发__call__方法")if __name__ == '__main__':    cl = Demo()    cl()输出:初始化方法在类实例化的时候执行将类实例当做函数调用的时候触发__call__方法2、总结   1、触发方式,将类实例像调函数一样调用的时候自动调用。   2、作用,让类实例可以像调函数一样调用。   3、构造方法__new__的执行是由创建对象触发的,即:对象 = 类名() 。   4、对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()​​​​​​​
  4. __len__(

    1、代码演示class Demo:    def __init__(self, name, age):        self.name = name        self.age = age
        def __len__(self):        return len(self.__dict__)
    if __name__ == '__main__':    cl = Demo("狗子", 22)    print(len(cl))输出:22、总结   1、触发方式,调用len()函数的时候自动化调用。   2、作用,计算对象的长度。​​​​​​​
  5. __del__()

    1、代码演示
    class Demo:    def __del__(self):        print("你别过来,我怕猪......")if __name__ == '__main__':    cl = Demo()2、总结   1、触发方式,对象在内存中被释放时,自动触发执行。   2、此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的。​​​​​​​
  6. __str__()

    1、代码演示class Demo:    def __init__(self):        pass    def __str__(self):        print("操作类实例的时候自动化调用__str__")        return "seccess"if __name__ == '__main__':    cl = Demo()    print(cl)输出:操作类实例的时候自动化调用__str__seccess2、总结   1、触发方式,操作类实例的时候自动调用。   2、作用,用于操作类实例的时候返回指定的数据。​​​​​​​
  7. __repr__()

    1、代码演示class Demo:    def __repr__(self):        return "与__str__功能一样"if __name__ == '__main__':    cl = Demo()    print(cl)输出:与__str__功能一样2、代码演示class Demo:    def __str__(self):        return "当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__"    def __repr__(self):        return "与__str__功能类似"if __name__ == '__main__':    cl = Demo()    print(cl)输出:当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__3、总结   1、触发方式,操作类实例的时候自动调用。   2、作用,与__str__()类似   3、当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__。​​​​​​​
  8. __eq__()

    1、代码演示class Demo:    def __init__(self):        self.num1 = 10        self.num2 = 20    def __eq__(self,obj):        print(self.num1)        print(obj.num2)        return self.num1 == obj.num2if __name__ == '__main__':    clA = Demo()    clB = Demo()    print(clA == clB )输出:1020False2、总结   1、触发方式,调用相等判断的时候自动调用。   2、作用,用于数据相等判断​​​​​​​
  9. __hash__()

    1、代码演示class Demo:    def __init__(self,name,age):        self.name = str(name)        self.age = str(age)    def __hash__(self):        return hash(self.name+self.age)if __name__ == '__main__':    cl = Demo("狗子",20)    print(hash(cl))输出:19359479268780972682、总结   1、触发方式,调用hash()方法时自动调用   2、作用,计算哈希值   3、只有不可变数据类型才有哈希值。​​​​​​​
  10. __getitem__()

    1、代码演示class Demo:    def __init__(self,name):        self.name=name    def __getitem__(self, item):        print("执行obj[key]获取实例属性的时候触发__getitem__方法")        return self.__dict__[item]
    if __name__ == '__main__':    cl = Demo("狗子")    print(cl["name"])输出:执行obj[key]获取实例属性的时候触发__getitem__方法狗子2、总结   1、触发方式,执行obj[key]获取实例属性的时候自动调用。   2、作用,用于返回属性值。​​​​​​​
  11. __setitem__()

    1、代码演示class Demo:    def __init__(self,name):        self.name=name    def __setitem__(self, key, value):        print("执行obj[key]=value的时候触发__setitem__方法")        self.__dict__[key]=valueif __name__ == '__main__':    cl = Demo("狗子")    cl["age"] = 20    print(cl.__dict__)输出:执行obj[key]=value的时候触发__setitem__方法{'name': '狗子', 'age': 20}2、总结   1、触发方式,执行obj[key]=value的时候自动调用。   2、作用,用于设置对象属性。​​​​​​​
  12. __delitem__()

    1、代码演示class Demo:    def __init__(self,name):        self.name=name    def __setitem__(self, key, value):        print("执行obj[key]=value的时候触发__setitem__方法")        self.__dict__[key]=value\
        def __delitem__(self, key):        print('执行 del obj[key]时触发__delitem__')        self.__dict__.pop(key)if __name__ == '__main__':    cl = Demo("狗子")    cl["age"] = 20    print(cl.__dict__)    del cl["age"]    print(cl.__dict__)输出:执行obj[key]=value的时候触发__setitem__方法{'name': '狗子', 'age': 20}执行 del obj[key]时触发__delitem__{'name': '狗子'}2、总结   1、触发方式,执行del obj[key]时自动调用。   2、作用,用于删除对象属性。

    ​​​​​​​

  13. __delitem__()

    1、代码演示class Demo:    def __init__(self,name):        self.name=name    def __setitem__(self, key, value):        print("执行obj[key]=value的时候触发__setitem__方法")        self.__dict__[key]=value    def __delattr__(self, item):        print('执行 del obj.key时候执行__delattr__')        self.__dict__.pop(item)if __name__ == '__main__':    cl = Demo("狗子")    cl["age"] = 20    print(cl.__dict__)    del cl.age    print(cl.__dict__)2、总结   1、触发方式,执行del obj.key时候自动调用   2、作用,用于删除对象属性。​​​​​​​

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element中的el-input-number+SpringBoot+mysql

1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id&#xff1a;"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…

java抽象工厂实战与总结

文章目录 一、工厂模式&#xff08;三种&#xff09;1.简单工厂模式1.1 概念&#xff1a;1.2 使用场景&#xff1a;1.3 模型图解&#xff1a;1.4 伪代码&#xff1a; 2.工厂方法模式2.1 概念&#xff1a;2.2 使用场景&#xff1a;2.3 模型图解&#xff1a;2.4 伪代码 3.抽象工厂…

用户反映在浏览器中使用AI工具 Copilot 遇到严重卡顿问题,微软官方给出初步解释

近日&#xff0c;多位用户反馈在使用Edge和Chrome浏览器中的Copilot时出现卡顿问题&#xff0c;甚至需要重启浏览器才能解决。对此&#xff0c;微软广告和网络服务部门CEO米哈伊尔帕拉欣表示&#xff0c;问题可能与Edge浏览器的“效率模式”有关。 微软中国官方网址链接&#x…

黑马——Java学生管理系统

一、学生管理系统 学生管理系统 需求&#xff1a; 采取控制台的方式去书写学生管理系统。 loop:while(true){ for(){ break loop;//给while循环取名loop&#xff0c;break loop;可以跳出while循环 } } 或者使用System.exit(0);停止虚拟机运行&#xff0c;相当于让所有代码停…

【表情识别阅读笔记】Towards Semi-Supervised Deep FER with An Adaptive Confidence Margin

论文名&#xff1a; Towards Semi-Supervised Deep Facial Expression Recognition with An Adaptive Confidence Margin 论文来源&#xff1a; CVPR 发表时间&#xff1a; 2022-04 研究背景&#xff1a; 对大量图片或视频进行手工标注表情是一件极其繁琐的事情&#xff0c;因此…

Python 自动化办公:一键批量生成 PPT

Stata and Python 数据分析 一、导读 在实际工作中&#xff0c;经常需要批量处理Office文件&#xff0c;比如需要制作一个几十页的PPT进行产品介绍时&#xff0c;一页一页地制作不仅麻烦而且格式可能不统一。那么有什么办法可以一键生成PPT呢&#xff1f;Python提供的pptx 包…

05章【面向对象(下)】

文章目录 继承继承的基本概念继承的限制继承小结子类的实例化过程方法的重写super关键字继承的应用示例final关键字 抽象类接口多态性instanceof关键字抽象类和接口的应用抽象类应用—模板方法模式接口应用—策略模式 Object类模式简单工厂模式静态代理模式适配器模式 内部类数…

策略模式【结合Spring框架实践】

Hello!~大家好啊,很高兴我们又见面了,今天我们一起学习设计模式–【策略模式】 初次对此模式不懂的,或者想偷懒的,我强烈建议大家跟着我的一起把概念和代码一起敲一遍!~为啥子??因为我就是这样学会的,哈哈哈! 1.首先我们看下此模式的整体UML图 selector:选择器又叫做上下文co…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了&#xff0c;前面介绍了大量的Java-NIO的内容&#xff0c;核心的内容Selector、Channel、Buffer、Reactor掌握了&#xff0c;那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力&#xff0c;下面讲解Netty核心原理与…

关于 LLM,你了解多少?

LLM定义 大语言模型&#xff08;LLM&#xff09;是一种基于大量文本数据训练的深度学习模型。它的主要功能是生成自然语言文本或理解语言文本的含义。这些模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、对话等&#xff0c;是通向人工智能的一条重要途径。 LLM发…

美创荣登“2023大数据产业年度最具投资价值”榜单

近日&#xff0c;由上海市经济和信息化委员会、上海市科学技术委员会指导&#xff0c;数据猿和上海大数据联盟主办的“第六届金猿季&魔方论坛——大数据产业发展论坛”在沪隆重召开&#xff0c;并重磅揭晓《2023大数据产业年度最具投资价值》榜单。 美创科技凭借在数据安全…

k8s-kubectl常用命令

一、基础命令 1.1 get 查询集群所有资源的详细信息&#xff0c;resource包括集群节点、运行的Pod、Deployment、Service等。 1.1.1 查询Pod kubectl get po -o wid 1.1.2 查询所有NameSpace kubectl get namespace 1.1.3 查询NameSpace下Pod kubectl get po --all-namespaces…

JAVA 学习 面试(二)多线程篇

Java多线程 线程池 线程池原理 创建方式&#xff1a;newFixedThreadPool (固定数目线程的线程池)、newCachedThreadPool(可缓存线程的线程池)、newSingleThreadExecutor(单线程的线程池)、newScheduledThreadPool(定时及周期执行的线程池)、new ThreadPoolExecutor() &#x…

Elasticsearch 常用信息

简述 本文针对 Elasticsearch&#xff08;简称ES&#xff09;集群6.x版本出现故障时&#xff0c;可通过提供的命令进行排查。 1、集群健康状态 集群健康状态状态说明red不是所有的主要分片都可用。表示该集群中存在不可用的主分片。可以理解为某个或者某几个索引存在主分片丢失…

AI破局之路:一名猎头高管的AI自学之旅——公众号

AI破局之路&#xff1a;一名猎头高管的AI自学之旅——公众号。 我是周知&#xff0c;有8年猎头行业经验深耕各类顶级科技企业。 2023年&#xff0c;应该有很多同行离开这个行业吧. 毕竟我们面临着前所未有的挑战。猎头行业的每一个参与者&#xff0c;无论是初入职场的猎头新人、…

2024最新科普:文件加密软件功能大盘点

随着信息化时代的到来&#xff0c;数据安全问题越来越受到人们的关注。 文件加密作为一种重要的数据保护手段&#xff0c;被广泛应用于企业和个人用户中。 本文将对文件加密软件的功能进行大盘点&#xff0c;帮助大家了解这一安全领域的知识。 一、文件加密软件的定义 文件加…

【STM32】USB程序烧录需要重新上电 软件复位方法

文章目录 一、问题二、解决思路2.1 直接插拔USB2.2 给芯片复位 三、解决方法3.1 别人的解决方法3.2 在下载界面进行设置 一、问题 最近学习STM32的USB功能&#xff0c;主要是想要使用虚拟串口功能&#xff08;VCP&#xff09;&#xff0c;发现每次烧录之后都需要重新上电才可以…

FRRouting学习(一) 配置日志文件

以配置isis event事件日志为例 1、在配置之前&#xff0c;/var/log/frr路径下是没有文件的&#xff1a; 2、在vtysh config之下输入&#xff1a;log file /var/log/frr/isisd.log debugging 后面的debugging表示日志级别&#xff0c;可以根据自己修改 3、配置好了之后&#xf…

Operation

contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3…

基于SpringBoot Vue求职招聘系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…