Python 魔术方法魔法方法超详细讲解魔术方法是 Python 中以双下划线__开头和结尾的特殊方法比如__init__、__str__它们会在特定操作自动触发不需要手动调用能让自定义类实现 Python 内置类型的行为比如加减乘除、打印、索引取值。它们的核心作用让自定义对象更符合 Python 语法习惯实现运算符重载、容器行为、上下文管理等功能。一、最基础、最常用的魔术方法1.__init__(self, ...)初始化方法触发时机创建对象时自动调用classPerson:# 初始化对象属性def__init__(self,name,age):self.namename self.ageage pPerson(小明,20)# 自动调用 __init__2.__str__(self)打印对象字符串触发时机print(对象)、str(对象)时自动调用作用自定义对象的打印信息默认打印内存地址classPerson:def__init__(self,name):self.namenamedef__str__(self):returnf人物{self.name}pPerson(小红)print(p)# 输出人物小红3.__repr__(self)开发用字符串表示触发时机在控制台直接输入对象、repr(对象)时触发区别__str__给用户看__repr__给开发者看def__repr__(self):returnfPerson({self.name})二、生命周期相关魔术方法1.__new__(cls)创建对象比__init__更早执行负责真正创建对象很少重写单例模式会用到。2.__del__(self)销毁对象触发时机对象被垃圾回收时自动调用程序结束、手动删除对象。三、容器/序列魔术方法列表/字典行为让你的自定义类像列表、字典一样使用魔术方法触发操作示例__len__(self)len(对象)返回元素个数__getitem__(self, key)obj[key]索引/键取值__setitem__(self, key, value)obj[key] x赋值__delitem__(self, key)del obj[key]删除元素__contains__(self, item)item in obj判断成员关系示例自定义一个类用起来像列表classMyList:def__init__(self):self.data[]# len(obj)def__len__(self):returnlen(self.data)# obj[0]def__getitem__(self,index):returnself.data[index]# obj[0] 100def__setitem__(self,index,value):self.data[index]value mlMyList()ml.data[1,2,3]print(len(ml))# 自动调用 __len__ → 3print(ml[0])# 自动调用 __getitem__ → 1四、运算符重载魔术方法加减乘除、比较让自定义对象支持 - * / 等运算1. 算术运算符方法操作__add__(self, other)obj other__sub__(self, other)obj - other__mul__(self, other)obj * other__truediv__(self, other)obj / other2. 比较运算符方法操作__eq__(self, other)__lt__(self, other)__gt__(self, other)示例对象相加classNumber:def__init__(self,num):self.numnum# 支持 运算def__add__(self,other):returnNumber(self.numother.num)aNumber(5)bNumber(3)cab# 自动调用 __add__print(c.num)# 8五、可调用对象__call__(self)触发时机把对象当成函数调用时obj()classTest:def__call__(self,x,y):returnxy tTest()print(t(1,2))# 自动调用 __call__ → 3六、上下文管理器__enter__/__exit__支持with语句像文件操作一样classMyContext:def__enter__(self):print(进入上下文)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):print(退出上下文)withMyContext():print(执行代码)七、属性相关魔术方法控制对象属性的获取、设置、删除__getattr__(self, name)获取不存在的属性时触发__setattr__(self, name, value)设置属性时触发__delattr__(self, name)删除属性时触发八、魔术方法核心总结格式__方法名__双下划线包裹特点自动触发不需要手动调用用途初始化/销毁对象自定义打印、运算、容器行为实现with、函数调用等高级语法最常用__init__、__str__、__len__、__getitem__、__add__总结魔术方法是 Python面向对象的核心特性它让自定义类能无缝适配 Python 的原生语法写出更简洁、更优雅的代码。你只需要记住Python 的内置操作底层都是靠魔术方法实现的。1.__new__方法介绍__new__是 Python 里真正创建实例对象的魔术方法比__init__更早执行。一句话总结__new__负责造对象分配内存__init__负责初始化对象给属性赋值一、基本区别方法作用调用时机返回值__new__创建实例类被实例化时最先调用必须返回一个对象__init__初始化实例__new__返回对象后才调用不能返回任何值必须是 None二、最简单示例classA:def__new__(cls,*args,**kwargs):print(执行 __new__)# 调用父类 object 的 __new__ 真正创建对象instancesuper().__new__(cls)returninstancedef__init__(self):print(执行 __init__)aA()输出顺序执行 __new__ 执行 __init__流程A()→ 先调用A.__new__(A)__new__内部通过父类创建实例并返回Python 拿到返回的实例自动调用__init__三、关键点第一个参数是cls当前类不是self必须返回一个实例返回本类实例才会触发__init__返回其他类实例不会触发本类__init__继承自object默认已经实现平时不用重写四、经典用法单例模式这是__new__最常用的场景——保证整个程序只产生一个实例。classSingleton:_instanceNonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instancesuper().__new__(cls)returncls._instance aSingleton()bSingleton()print(aisb)# True 同一个对象五、一个“反常”例子如果__new__不返回本类实例__init__就不会执行classA:def__new__(cls):print(__new__)return123# 返回 int不是 A 的实例def__init__(self):print(__init__)# 永远不会执行aA()print(a)# 123六、和__init__参数关系__new__和__init__会共享传入的参数classA:def__new__(cls,name):print(__new__:,name)returnsuper().__new__(cls)def__init__(self,name):print(__init__:,name)aA(Tom)极简总结__new__造对象静态方法返回实例__init__初始化实例方法无返回值平时不用写__new__只有单例、控制实例创建、元类时才会用到