[ python ] 类中的一些特殊方法
item系列


要注意反射的 __delattr__ 和 __delitem__ 使用不同的方式触发不同的特殊方法。

__str__ 和 __repr__
当直接打印一个对象的时候,显示的是一段内存地址。

为了便于更好的理解,我们定义一个__str__方法

定义了__str__方法,直接输出对象还是打印的内存地址,并没有走__str__方法中定义的格式,用print输出信息却调用了__str__方法定义的内容

定义了__repr__方法,不管是直接打印对象还是通过print打印对象,都是走的__repr__中定义的格式。
总结:
__repr__ 和 __str__ 这两个方法都是用于显示的,__str__是面向用户的,而__repr__是面向程序员
使用print打印操作会首先尝试__str__和str内置函数,它通常应该返回一个友好的提示
当__str__不存在的时候,会去找__repr__是否定义,定义则打印__repr__中定义的内容
当我们想在所有环境下都统一显示的话,可以添加__repr__方法。
当我们想在不同的环境下支持不同的显示,就可以定义__repr__方法和__str__方法,终端交互使用__repr__,用户使用__str__方法
__new__
__new__ 是在新式类中出现的方法,它作用在构造函数之前,可以这么理解,在python中存在于类里面的构造方法__init__()负责将类实例化,而在__init__() 启动之前,__new__()决定是否要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别的对象作为本类的实例。
具体参考:https://www.cnblogs.com/ifantastic/p/3175735.html
要记住的是:在实例化时,__new__() 先与 __init__() 方法执行.
通常来讲,新式类开始实例化时,__new__()方法会返回cls(cls代指当前类)的实例,然后该类的__init__()方法作为构造方法会接收这个实例(self)作为自己的一个参数,然后依次传入__new__()方法中接收的位置参数和命名参数。

对于__new__ 和 __init__ 的个人理解如下:
首先,我们把一个类比一个生物,使用__new__方法是创建这个生物的本体(实例),当本体(实例)创建好,才能使用__init__来创建这个本体的属性
一个单例模式来印证上面的描述:

通过__new__方法,首先创建实例的本体,当第二次实例化时,通过if判断,这个本体已经存在,就直接返回,然后在调用__init__()方法附加属性值
python3 正常的使用格式:

__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无需定义,因为python是一门高级语言,程序员在使用时无需关心内存和释放,因为此工作都是交给python解释器来执行的,所有,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
在 pycharm中当程序执行完,自动触发 __del__ 方法

__call__
当对象+()时候[object()] 触发

__len__
使用 len(object) 触发

__hash__
调用 hash(object) 触发

__eq__
当两个对象进行比较时,触发

实例练习:纸牌

本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16764856.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码