首页 > 编程语言 >详解Python魔法函数,__init__,__str__,__del__

详解Python魔法函数,__init__,__str__,__del__

时间:2024-03-07 12:12:56浏览次数:32  
标签:__ 调用 Python self 魔法 对象 init

1、简介

Python作为一门灵活而强大的编程语言,提供了许多特殊的方法,被称为魔法函数(Magic methods)。这些魔法函数以双下划线开头和结尾,能够让我们自定义类的行为,使得Python更加灵活和易用。本文将详细介绍Python中的魔法函数,帮助读者理解其作用和用法。

1.1、什么是魔法函数?

魔法函数(Magic methods),也被称为特殊方法(Special methods)或双下划线方法(Dunder methods),是Python中的一种特殊的方法。它们以双下划线开头和结尾,例如__init____str____repr__等。

这些方法在类定义中具有特殊的含义,Python会在特定的情况下自动调用它们。通过实现这些魔法函数,我们可以自定义类的行为,使其具有更多的灵活性和功能。

魔法函数可以用于控制对象的创建与销毁、字符串表示、运算符重载、容器操作、属性访问等多种情况。例如,__init__方法用于初始化对象,在对象创建时被调用;__str__方法控制对象在被转换为字符串时的行为;__getitem____setitem__方法用于实现对象的索引操作等。

2、魔法函数分类

魔法函数可以分为几类,包括对象创建与销毁、字符串表示、运算符重载、容器操作等。每种类型的魔法函数都有特定的作用,下面我们将逐一介绍。

对象创建与销毁

  • __new__(cls, *args, **kwargs): 用于创建对象实例,在__init__之前调用。
  • __init__(self, *args, **kwargs): 对象初始化方法,在创建对象后立即调用。
  • __del__(self): 对象销毁方法,在对象被销毁时调用。

字符串表示

  • __str__(self): 控制对象转换为字符串的行为,通过str(object)print(object)调用。
  • __repr__(self): 控制对象转换为可供解释器读取的字符串的行为,通过repr(object)调用。

容器操作

  • __len__(self): 控制对象长度的行为,通过len(object)调用。
  • __getitem__(self, key): 控制对象索引操作的行为,通过object[key]调用。
  • __setitem__(self, key, value): 控制对象赋值操作的行为,通过object[key] = value调用。
  • __delitem__(self, key): 控制对象删除操作的行为,通过del object[key]调用。
  • __iter__(self): 返回一个迭代器对象,用于对象的迭代操作。

比较操作

  • __eq__(self, other): 控制对象相等性比较的行为,通过object1 == object2调用。
  • __ne__(self, other): 控制对象不等性比较的行为,通过object1 != object2调用。
  • __lt__(self, other): 控制对象小于比较的行为,通过object1 < object2调用。
  • __gt__(self, other): 控制对象大于比较的行为,通过object1 > object2调用。
  • __le__(self, other): 控制对象小于等于比较的行为,通过object1 <= object2调用。
  • __ge__(self, other): 控制对象大于等于比较的行为,通过object1 >= object2调用。

数值运算

  • __add__(self, other): 控制对象加法运算的行为,通过object1 + object2调用。
  • __sub__(self, other): 控制对象减法运算的行为,通过object1 - object2调用。
  • __mul__(self, other): 控制对象乘法运算的行为,通过object1 * object2调用。
  • __truediv__(self, other): 控制对象真除运算的行为,通过object1 / object2调用。
  • __floordiv__(self, other): 控制对象整除运算的行为,通过object1 // object2调用。
  • __mod__(self, other): 控制对象取模运算的行为,通过object1 % object2调用。
  • __pow__(self, other[, modulo]): 控制对象幂运算的行为,通过object1 ** object2调用。

属性访问

  • __getattr__(self, name): 控制对不存在的属性的访问。
  • __setattr__(self, name, value): 控制对属性的赋值操作。
  • __delattr__(self, name): 控制对属性的删除操作。

其他

  • __contains__(self, item): 控制对象成员关系测试的行为,通过item in object调用。
  • __call__(self, *args, **kwargs): 控制对象的调用行为,使对象可以像函数一样被调用。

这些是Python中常见的魔法函数,通过实现其中的一个或多个,我们可以对类的行为进行高度定制化。

3、重写魔法函数

除了使用Python提供的魔法函数默认功能外,我们还可以重写类的魔法函数,以实现特定的行为。

例如:重写__str__函数,但是里面只返回123,这样在print对象时,就会打印123,而不是对象的地址。

class MyClass:
    def __str__(self):
        return '123'

obj = MyClass()
print(obj)  # 输出: 123

4、总结

通过本文的介绍,相信你应该对Python中的魔法函数有了基础的了解。魔法函数为我们提供了丰富的功能和灵活的定制选项,使得我们能够更加轻松地编写出强大而优雅的Python代码,希望你能够通过本文的学习,更加熟练地运用魔法函数,提高自己的编程水平。

关注公众号【Python魔法师】,回复python 一起进群沟通交流~

qrcode.jpg

推荐链接

标签:__,调用,Python,self,魔法,对象,init
From: https://www.cnblogs.com/meet/p/18058582

相关文章

  • Spring反序列化失败 Type definition error: [simple type, class xxx.xxx.xxx]
    也许更好的阅读体验Typedefinitionerror:[simpletype,classcom.elm.po.CommonResult];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannotconstructinstanceofcom.elm.po.CommonResult(noCreators,likedefaultconstru......
  • MySQL explain
    简介mysqlexplain(或desc)用于分析SQL语句的执行计划,多用于测试查询性能。语法:explainsql...注意explain执行DML语句,数据不发生变化。explain执行的结果可以有多条数据,一条数据对应一个表,如果涉及union,MySQL内部会产生一个临时表,就会导致结果多一行数据。unionall不会创建......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋
    977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/description/publicstaticint[]sortedSquares(int[]nums){intleft=0;intright=nums.length-1;int[]result=newint[nums.length];intwrite=......
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
    1、前言为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以就想着将这些功能抽......
  • 关于uniapp调用支付宝登录问题
    uniapp的uni.login的provider不支持支付宝但是呢,我看插件市场都要钱这个还需要钱吗你直接硬写呗,支付宝比如登录官方时这么写的ok 我们在uniapp上也这么写就行了button调用一键登录uniapp不会报错,然后我们发行打包到支付宝的开发工具里经测试可以正常使用 返回 ......
  • k8s集群安装nfs持久化存储
    k8s集群安装nfs-server服务下载并修改yamlmkdir-p/root/yaml/addons/nfscd/root/yaml/addons/nfswgethttps://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/example/nfs-provisioner/nfs-server.yaml修改yaml内容,添加namespace[root@ku......
  • HNOI 2024 游记 & 后记
    Day1凌晨四点钟醒来了,然后没睡着。进考场之后看T1,感觉枚举\(m\bmodn\)然后就是分段函数,有点细节,写写写,四十分钟写完了。看T2,但这个题没啥感觉啊。跳了跳了。看T3,想了一下很快会了\(32\)分。然后感觉可以多做点啊。狂暴猜结论!假假假!狂暴猜结论!假假假!花了挺久时间的,感......
  • Qt - 坐标系及转换
    屏幕与窗口****屏幕坐标(绝对坐标)窗口坐标(相对坐标)****pos():描述:本控件到父控件的相对坐标窗口的屏幕坐标(上图黑线)描述:窗口左上角-屏幕原点QPoint=this->pos()centerWidet到pushbutton的距离(上图蓝线)描述:button的父控件-centerWidetui->button->pos()描述:button认一......
  • c# 文件转为byte 存储到SQL Server数据库,数据库读取byte字段下载到本地
    //fileLocal为文件路径 System.IO.FileStreamfs=newSystem.IO.FileStream(fileLocal,FileMode.Open);        BinaryReaderbr=newBinaryReader(fs);        byte[]fileData=br.ReadBytes(Convert.ToInt32(fs.Length));    ......
  • elasticsearch——搜索引擎工具
    创建一个网络,到时候ES要和kibana(可视化工具)放同一个网络(也可以直接用docker-compose一键部署,不过有时不需要两个都开,所以逐一部署吧) dockernetworkcreatees-net然后去DockerHub找文档,dockerpull一下ES和kibana,或者网上找镜像包单点部署ESdockerrun-d\ --namees\......