python 析构函数_常用的python类的魔术方法

对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言。在其他面向对象的语言中有构造函数、析构函数等等在生命周期不同时机自动调用的函数,python当然也是有的。除此之外,python类还有很多神奇的编写方式让对象的表现更加丰富,这些方法也被称为魔术方法。在 python中魔术方法还是比较多的,这里只挑最常用的几个来讨论一下。

1. 与生命周期有关的魔术方法

所谓生命周期是指事物产生、运行和消亡等存在过程中的若干特殊的时机。对于面向对象而言,常常被谈到的就是构造函数和析构函数。python中提供了__new__函数作为构造函数,即在对象创建时调用的函数;__del__函数作为析构函数,即在对象被销毁时调用的函数;python还提供了__init__函数在初始化的时候被调用。

f31033d8762a461ba37115e9de980f39.png

与生命周期有关的魔术方法

从以上的演示中可以看出,构造函数__new__最先被调用,其次是__init__初始化函数,最后在对象被销毁时调用了__del__函数。知道了这些函数运行的时机就可以利用它们做一些有意义的事情。最常用的是__init__函数,一般在这个函数中进行对象成员的初始化设置;其次是__del__析构函数,一般用于关闭一些占用的资源,避免资源泄漏;最后__new__函数非常不常用,一般而言可以不用了解。

2. 与比较相关的魔术方法

在其他面向对象的语言中有操作符重载来实现对象之间的比较功能,python没有直接使用操作符重载,而是使用几个魔术函数来实现的。__gt__函数用于实现“大于号”比较,__lt__用于实现“小于号”比较,__ge__用于实现“大于等于”的比较,__le__用于实现“小于等于”的比较。

cad0eae7b9cca43c1a13c9e97c53d9f1.png

与比较相关的魔术方法

3. 与数值计算相关魔术方法

有时也有一些数值计算方面的处理需要进行简化。python提供了__abs__函数来实现取绝对值操作abs(),__pos__函数实现取“正”操作,__neg__函数实现取“负“操作。

56131fa627841a2c2990b45dda7d227f.png

与数值计算相关魔术方法

4. 与调用相关的魔术方法

python中有一些很常用的函数,比如len,str等等,我们常常需要对一些对象使用这种操作。如果是自定义的类型,就需要实现一些魔术方法达到目的。__str__函数用于str()的调用,__hash__函数用于hash()的调用,__len__函数用于len()的调用,__call__函数用于实现以对象自己作为函数名来进行调用。熟悉了这些魔术方法之后就可以自定义更加通用的类型。

c43b44bb96da2c71b174887f5807b902.png

与调用相关的魔术方法

5. 与语法相关的魔术方法

循环是各种编程语言都比较常用的语法,而python中的循环就更加简便。python中的序列结构都可以直接放在for循环中进行遍历,那么自定义的类型可不可以也做成这样的呢?当然可以,就是用过实现__iter__ 和 __next__两个函数来达到目的的。

python中还有一种很常用的语法叫“with子句”,这种语法的方便之处就是使用完资源的句柄之后会自动释放,不需要显式手动close。要让自己定义的数据类型能够在这样的语法场景下使用就需要实现__enter__和__exit__两个函数。其中__enter__函数是在with子句创建的时候调用的,而__exit__函数就是在with子句结束时自动调用来释放占用的资源。

4a2c794642b7060ed59679dbc611895b.png

与语法相关的魔术方法

到此,一些常用的魔术方法就介绍完毕。对于python的初学者而言,应该是会有一些启发作用。但是python中的魔术方法远不止于此,对于想要了解更多魔术方法的朋友,本文也可以起一个抛砖引玉的作用。本文的notebook版本共享在GitHub上,感兴趣的朋友可以在GitHub上cnbluegeek/notebook仓库下载。

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

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

相关文章

微软桌面虚拟化vdi 安装测试体验

最近同事在讨论桌面虚拟化,说目前很多企业都准备上桌面虚拟化,结合众多的解决方案,觉得微软的桌面虚拟化方案不错,相对与citrix的xendesktop,vmware view 有一定的价格优势,心里想,微软是大公司&#xff0c…

mysql 8.0.22_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

前言前几天下载安装了最新版的MySQL 8.0.22,遇到了不少问题,参考了一些方法,最终得以解决。今天将自己的安装过程记录下来,希望对各位有所帮助。一、MySQL 8.0.22官网下载点击进入MySQL官网:https://www.mysql.com/① …

android获取网络图片

2019独角兽企业重金招聘Python工程师标准>>> 资源描述: 关于android获取网络图片主要是把网络图片的数据流读入到内存中然后用1.Bitmap bitMap BitmapFactory.decodeByteArray(data, 0, length); 方法来将图片流传化为bitmap类型 这样才能用到1.imageView.setImage…

WSS Alert(邮件提醒) 定制

项目需要&#xff0c;研究了一下WSS的Alert定制。 定制有两种方法: (方法1)修改模板文件 默认模板是12\TEMPLATE\XML\alerttemplates.xml,将这个模板复制一份修改,然后用stsadm命令添加模板: STSADM -o updatealerttemplates -url <http://urlname> -filename <your w…

windows log日志分割_如何将日志记录到 Windows事件日志 中

每当出现一些未捕获异常时&#xff0c;操作系统都会将异常信息写入到 Windows 事件日志 中&#xff0c;可以通过 Windows 事件查看器 查看&#xff0c;如下图&#xff1a; 这篇文章将会讨论如何使用编程的方式将日志记录到 Windows 事件日志 中。 安装 EventLog 要想在 .NET Co…

偷窃转基因玉米种子引发中美打农业官司

偷窃转基因玉米种子引发中美打农业官司 请看下面相片&#xff1a; 这张相片是孩子们与转基因玉米在一起的景象。转基因玉米颗粒饱满&#xff0c;孩子们的小手差点儿抓不住&#xff08;由于玉米棒子非常粗&#xff09;。广大农民喜欢这样的抗虫、耐药并且产量高的农作物&#xf…

mysql中视图的概念_MySql中的视图的概念及应用

视图的基本概念视图是从一个或几个基本表(或者视图)导出的表。它与基本表不同&#xff0c;是一个虚表。数据库只存放视图的定义&#xff0c;而不存放视图对应的数据&#xff0c;这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化&#xff0c;从视图中查询出的数据也…

JQuery常用的代码片段

2019独角兽企业重金招聘Python工程师标准>>> JQuery常用的代码片段 JQuery在当前众多网站开发中都有用到。他简易的操作以及对各个浏览器的兼容性&#xff0c;被广大的开发者一致看好。 下面是一些常用实用的 JQuery 代码片段。看看有没有需要收藏的吧&#xff1a; …

linux环境配置

在安装linux之前首先要明白linux系统的功能特性&#xff0c;linux是多少位 的&#xff0c;对要使用的工具要有大体的了解&#xff0c;那样就不至于在之后的安装中耽误太多时间&#xff0c;比如安装的系统是32位的就要安装与之对应的工具。我们大体上了解一下linux能支持的又比较…

tomcat 启动速度慢背后的真相

1. tomcat 启动慢 在线上环境中&#xff0c;我们经常会遇到类似的问题&#xff0c;就是tomcat 启动比较慢&#xff0c;查看内存和cpu,io都是正常的&#xff0c;但是启动很慢&#xff0c;有的时候长达几分钟&#xff0c;这到底是什么原因导致的。 1.1 tomcat 获取随机值阻塞 ​ …

[导入]相片: 23853741.jpg

文章来源:http://img.blog.163.com/photo/NdAK9XEb2a-KOR7zpDWpAA/588564176302178421.jpg转载于:https://www.cnblogs.com/baiyirui/archive/2008/04/27/1173117.html

手摇泵PHP一32_节能手摇泵的制作方法

本实用新型属于液压动力装置技术领域&#xff0c;特指一种节能手摇泵。背景技术&#xff1a;如图1-2所示&#xff0c;目前&#xff0c;手摇泵采用分体式结构&#xff0c;比如&#xff0c;左横向出油通道和右横向出油通道是装配在泵体上的&#xff0c;由于零件较多&#xff0c;所…

掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去&#xff0c;取而代之的是 Microsoft ADO.NET 强大而又灵活的功能。我们的新武器就是 System.Data 名称空间&#xff0c;它的特点是具有速度极快的 DataReader 和功能丰富的 DataSet&#xff0c;而且打包在一个面向对象…

HTML入门学习 -- HTML基础知识

打算按照 HTML -> CSS –> JavaScript –> jQuery –> HTML5 –> WebGL 的顺序&#xff0c;简略学习一下Web前端技术。 因为不是搞Web的&#xff0c;只需要大概过一下有个印象就行&#xff0c;每一项花费3天到一周时间走马观花的看看。 编辑器就选择Sublime Tex…

并发编程实战(一)

并发编程的三个核心问题: 分工 : 高效的拆解任务分给线程同步 : 线程之间的协作互斥 : 保证同一时刻只允许一个线程访问共享资源这个其实不难理解,做个简单的比喻,我们团队做一个项目的时候肯定是先分配任务(分工),然后等到任务完成进行合并对接(同步),在开发过程中,使用版本控…

java pdf打印_Java 打印PDF文档

本文将介绍如何在Java应用程序中打印PDF文档。一般有以下三种常见打印方式&#xff1a;静默打印显示打印对话框打印打印PDF时自定义纸张大小使用工具&#xff1a;Free Spire.PDF for Java创建运行环境&#xff1a;方式 1&#xff1a;通过官网下载组件&#xff0c;解压后将lib文…

微信支付配置参数:支付授权目录、回调支付URL

一、开通微信支付的首要条件是&#xff1a;认证服务号或政府媒体类认证订阅号&#xff08;一般认证订阅号无法申请微信支付&#xff09;二、微信支付分为老版支付和新版支付&#xff0c;除了较早期申请的用户为老版支付&#xff0c;现均为新版微信支付。三、公众平台微信支付开…

[导入]关于阶乘的两个常见算法及一个相关面试题

摘要: 本文首先给出了阶乘的数学定义&#xff0c;然后说明了它的两种简单算法&#xff0c;最后提供了一个很有意思的与阶乘相关的面试题的思路。 阅读全文Anders Cui 2008-05-19 12:12 发表评论文章来源:http://www.cnblogs.com/anderslly/archive/2008/05/19/factorial-algor…

autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟

AutoResetEvent, ManualResetEvent是C#中常用的线程同步方法&#xff0c;在Java中可以模拟&#xff0c;AutoResetEvent使用Semaphore&#xff0c;增加的是许可证数量&#xff0c;程序里只有一个许可证&#xff0c;那么当这个许可被使用后&#xff0c;就会自动锁定。相反&#x…

用Jfree实现条形柱状图表,java代码实现

用Jfree实现条形柱状图表&#xff0c;java代码实现。可经经常使用于报表的制作&#xff0c;代码自己主动生成后能够自由查看。能够自由配置图表的各个属性&#xff0c;用来达到自己的要求和目的package test1;import org.jfree.chart.*; import org.jfree.chart.plot.*; import…