详解Python魔法函数,__init__,__str__,__del__
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
一起进群沟通交流~
推荐链接
详解Python魔法函数,__init__,__str__,__del__的更多相关文章
- python中魔法方法__init__,__str__,__del__的详细使用方法
1. python中的魔法方法, 类似__init__, __str__等等,这些内置好的特定的方法进行特定的操作时会自动被调用 2. __init__的使用方法 class 类名(object): ...
- 详解Python中的__init__和__new__(静态方法)
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...
- 详解Python中的__init__和__new__
转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...
- 详解python中的__init__与__new__方法
一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
- 详解python函数的参数
详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...
- 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)
详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类 Python中函数参数定义及调用函数时传参 ...
- 详解python的装饰器decorator
装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...
- python魔法函数__dict__和__getattr__的妙用
python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...
- 详解Python中re.sub--转载
[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...
随机推荐
- Map结构映射,避免每一个字段赋值
var query1 = (from fore in forecastShippingDate join ship in shipOutOfStock on fore.Id equals ship.F ...
- 小白学k8s(2)理解flannel网络
理解flannel网络 简介 Kubernetes中的网络 flannel 总结 参考 理解flannel网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简 ...
- 中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话
中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话 1.背景介绍介绍 最近,通用领域的大语言模型 (LLM),例如 ChatGPT,在遵循指令和产生类似人类响应方面取得了显著的成功 ...
- 5.10 Windows驱动开发:摘除InlineHook内核钩子
在笔者上一篇文章<内核层InlineHook挂钩函数>中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能 ...
- C++ CryptoPP使用RSA加解密
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...
- 聊聊 AI 平台存储方案和选型
最近火爆全网的 ChatGPT 再次带来一股 AI 热潮. 过去的五年,AI 快速发展并应用到很多领域中.作为一家存储企业,我们也感受到了 AI 行业的活力,和我们交流团队中,AI 企业越来越多,有自 ...
- SpringBoot不再需要@Autowired来注入属性
实操部分 需要lombok依赖 在对应需要注入属性的类上添加注解 @RequiredArgsConstructor 所有需要注入的属性改为final修饰 为什么 lombok的@RequiredArg ...
- 全脸 苦思设计了半年的注册中心,与spring cloud 的做法 基本一致
早知道不去自己思考设计了,害死了不少脑细胞,物理层的东西,所有设计者的思路 都基本一致: 没有必要每个微服务都要做一次安全校验,一个物理集群,一个网关: 网关校验token后,把用户信息 保存到 ht ...
- 详解最新版RabbitMQ 基于RPM 方式的安装
如何选择安装版本 已经不支持的发布系列 版本 最后补丁版本 首次发布时间 停止更新时间 3.7 3.7.28 2017年11月28日 2020年09月30日 3.6 3.6.16 2015年12月22 ...
- 惠普CP1025后盖传感器松导致不停自检或打印中掉电, 跳闪三角灯
上次修了离合器, 没出两星期又出问题了. CP1025这个型号就是出名的开机特别慢, 正常自检是1分钟, 但是前天我在给机器换完粉盒后, 自检似乎进入了死循环, 一直在自检. 周末才有空看看能不能解决 ...