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,一经查实,立即删除!

相关文章

【linux基础】关于ARM板子使用O3编译选项优化

前言 应领导要求需要将最初级版本的算法移植到ARM板子上,并进行优化,以期达到实时。 平台 移植前: TX2 移植后: ARM() processor : 3 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 7.54 Features : swp h…

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

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

ASP应用之模板采用

初学ASP,程序是能勉强写出来了,但若每进行一次网站页面的改版,所有的源程序都将进行一次移植手术。为此所耗费的人力精力不计其数,甚至一不小心得不偿失、前功尽弃。所以,梦想着那么大段的程序代码变成几个简单的字符代…

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

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

RedHat 脚本搭建dns服务!

1.配置好yum脚本 #!/bin/bash# by breaklinux echo "--------------- mount cdrom ------------------"umount /dev/cdrom &> /dev/nullmount /dev/cdrom /mnt &> /dev/nullecho "--------------- create yum ------------------"touch /etc…

国外开源.Net 系统概述

转载自:http://www.aspx1.com (ASP.NET学习门户) 搜索了几个搜索引擎,找了一些.net的开源系统,(申明一下,下面的看只是个人看法,只供参考)。 一、DotNetNuke DotNetNuke是一个.Net平台下&#x…

dateframe行列插入和删除操作

ar np.array(list("ABCDEFG")) # array只是Convert,默认会copy源值。asarray也是Convert,如果源值是array则不copy.print(ar)ar np.full((2,4), 3, np.int32) # 创建一个指定初始值的数组print(ar)zero_ar np.zeros(10, np.int32) # 创建一个初始…

android获取网络图片

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

gitlab备份及恢复

gitlab备份步骤 https://blog.csdn.net/qq_31666147/article/details/79844107 gitlab版本 下载地址 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ gitlab-ce-10.4.4-ce.0.el7.x86_64.rpm 备份恢复gitlib版本必须相同 转载于:https://www.cnblogs.com/mutong1228…

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…

SQL Server : 禁止在SQL Server中生成用户实例

一、打开SQL工具&#xff0c;右键点服务器&#xff0c;新建查询 二、输入如下查询&#xff1a;exec sp_configure user instances enabled, 1 三、在查询中再运行&#xff1a;Reconfigure 四、然后重启SQL SERVER服务转载于:https://www.cnblogs.com/dushouke/arch…

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

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

bzoj1190:[HNOI2007]梦幻岛宝珠

传送门 二进制分组优化背包 理解的差不多了&#xff0c;但是无法具体阐述&#xff0c;留坑 代码&#xff1a; #include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<cstring> using namespace std; void read(in…

JQuery常用的代码片段

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

Lession 14 Do you speak Englist?

1过去完成时:1>动作发生在过去的过去;在过去动作完成,对过去产生影响,过去的时间壮语;2>原打算,但没实际的愿望;3>没听清,再次提问;had 过去分词2 New words and Expressions;amusing;experience;wave;lift;reply;language;journey;1>speak;speaker;say;说话内容;…

linux中mysql与eclipse_Linux下eclipse CDT及mysql安装,c++访问mysql数据库

5. 关于eclipse编译project由于程序中有#include所以需要在eclipse中加上对mysql.h的路径项目->属性->C/CBuild -> settings -> gcc c complier ->includes -> include paths添加两个路径&#xff1a;/usr/lib/mysql&#xff1b;/usr/include/mysql对于64位的…

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 获取随机值阻塞 ​ …