Python 魔法方法详解 + 全套可运行代码示例

Python 魔法方法详解 + 全套可运行代码示例 魔法方法以xx双下划线包裹内置自动触发不用手动调用创建对象、运算、打印、取值、生命周期都会自动执行。一、基础生命周期魔法方法1.new创建实例最先执行2.init初始化实例构造方法3.del销毁实例析构方法classPerson:# 创建对象内存def__new__(cls,name):print(1. __new__ 创建对象)returnsuper().__new__(cls)# 初始化属性def__init__(self,name):print(2. __init__ 初始化)self.namename# 对象销毁时触发def__del__(self):print(f3. __del__{self.name}对象被销毁)#测试pPerson(小明)print(p.name)delp# 主动销毁二、字符串展示魔法方法strprint(对象) 人性化显示repr控制台直接输出、调试显示classBook:def__init__(self,title,price):self.titletitle self.priceprice# 面向用户展示def__str__(self):returnf书籍{self.title}价格{self.price}元# 面向开发者调试def__repr__(self):returnfBook({self.title},{self.price})bBook(Python入门,59)print(b)# 调用 __str__print(repr(b))# 调用 __repr__三、属性操作魔法方法getattr访问不存在属性触发setattr给属性赋值触发delattr删除属性触发getattribute所有属性访问都会先走classStudent:def__init__(self,age):self.ageage# 任意属性访问最先触发def__getattribute__(self,item):print(f访问属性{item})returnsuper().__getattribute__(item)# 属性不存在才触发def__getattr__(self,item):returnf不存在属性{item}# 属性赋值触发def__setattr__(self,item,value):print(f赋值{item}{value})super().__setattr__(item,value)# 删除属性def__delattr__(self,item):print(f删除属性{item})super().__delattr__(item)stuStudent(18)print(stu.age)print(stu.name)# 不存在属性stu.age20delstu.age**### 四、容器类魔法方法列表/字典风格lenlen(对象)getitem对象[下标]setitem对象[下标] 值delitemdel 对象[下标]classMyList:def__init__(self):self.data[]def__len__(self):returnlen(self.data)def__getitem__(self,idx):returnself.data[idx]def__setitem__(self,idx,val):self.data[idx]valdef__delitem__(self,idx):delself.data[idx]arrMyList()arr.data[10,20,30]print(len(arr))print(arr[1])arr[0]99delarr[2]print(arr.dat五、运算符重载魔法方法自定义对象支持 - * 运算classVector:def__init__(self,x,y):self.xx self.yy# 加法 def__add__(self,other):returnVector(self.xother.x,self.yother.y)# 减法 -def__sub__(self,other):returnVector(self.x-other.x,self.y-other.y)# 等于 def__eq__(self,other):returnself.xother.xandself.yother.ydef__str__(self):returnf({self.x},{self.y})v1Vector(2,3)v2Vector(1,4)print(v1v2)print(v1-v2)print(v1v2常用运算魔法对照表addsub-mul*truediv/eqgtlt六、可迭代、上下文管理器魔法1.iternext迭代器 for遍历classCount:def__init__(self,max_num):self.max_nummax_num self.current0def__iter__(self):returnselfdef__next__(self):ifself.currentself.max_num:self.current1returnself.currentraiseStopIteration#for 循环自动调用迭代魔法fornuminCount(5):print(num)2.enterexitwith 上下文自动开启、自动关闭资源文件、数据库常用classFileHelper:def__enter__(self):print(打开资源)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):print(关闭资源自动收尾)defread(self):print(读取数据)withFileHelper()asf:f.read()七、调用魔法call对象可以像函数一样 () 调用classCalc:def__call__(self,a,b):returna*b cCalc()resc(3,5)# 直接调用对象print(res)八、常用魔法方法速查表魔法方法触发时机__new__创建对象__init__初始化对象__del__对象销毁__str__print打印__repr__调试输出__getitem__对象[索引]__len__len(对象)__add__对象对象__call__对象()调用__iter__/__next__for遍历__enter__/__exit__with语句所有代码直接复制就能运行看懂例子就能手写自定义魔法类。