python9(特殊方法)
一、魔术方法的概念与定位在前文的基础上我们今天来学一下python的特殊方法定义以双下划线开头和结尾的特殊方法如__init__、__add__在 Python 中具有预定义的语义。特性无需显式调用由 Python 解释器在特定操作如对象实例化、下标访问、算术运算发生时自动触发。这些方法本质上是一种“钩子”机制——开发者定义其行为Python 在对应的语言事件中予以执行。掌握这些方法即掌握了自定义对象行为与语言内置类型行为对齐的核心途径。二、核心魔术方法逐一解析1.__init__(self[, ...])—— 实例初始化器该方法在对象实例化后自动执行用于设置实例的初始状态。它并非真正意义上的构造器实际构造由__new__负责而是初始化阶段。classEx:def__init__(self,arg1,arg2):print(f__init__被调用, arg1:{arg1}, arg2:{arg2})eEx(a,b)# 输出__init__被调用, arg1:a, arg2:b2.__call__(self[, ...])—— 使实例可调用定义该方法后实例对象可以像函数一样使用括号语法调用。classEx:def__call__(self,arg1,arg2):print(f__call__被调用, arg1:{arg1}, arg2:{arg2})eEx()e(a,b)# 输出__call__被调用, arg1:a, arg2:b此特性在实现有状态函数、装饰器、工厂类等场景中具有实用价值。3.__getitem__(self, key)—— 支持下标访问obj[key]实现该方法后对象可使用方括号语法进行索引或键值访问行为类似于列表或字典。classEx:def__getitem__(self,key):print(f__getitem__被调用, key:{key})return[a,b,c][key]ifisinstance(key,int)else{0:零,1:壹}[key]eEx()print(e[2])# 先打印调用信息再返回 c注该方法亦能支持切片操作当传入slice对象时属进阶用法。4.__repr__与__str__—— 对象字符串表示__str__面向终端用户在print(obj)或str(obj)时调用强调可读性。__repr__面向开发者在repr(obj)或交互式环境直接输入对象名时调用要求返回的字符串应尽可能明确、准确通常可用于重建对象。优先级关系若未定义__str__则回退至__repr__反之不成立。classEx:def__repr__(self):returnrepr__被调用def__str__(self):returnstr__被调用eEx()print(str(e))# str__被调用print(f{e})# str__被调用f-string默认采用__str__print(e)# 同样输出 str__print优先使用__str__建议至少实现__repr__以提升调试效率和信息可读性。5. 算术运算符对应方法加减乘除1正向运算__add__/__sub__/__mul__/__truediv__当实例对象位于运算符左侧时对应方法被调用。classNumber:def__init__(self,num):self.numnumdef__add__(self,other):returnself.numotherdef__sub__(self,other):returnself.num-otherdef__mul__(self,other):returnself.num*otherdef__truediv__(self,other):returnself.num/other nNumber(6)print(n7)# 13print(n-4)# 2print(n*4)# 24print(n/3)# 2.02反向运算__radd__/__rsub__/__rmul__/__rtruediv__当实例对象位于运算符右侧且左侧操作数不是该类的实例时触发反向方法。classNumber:def__init__(self,num):self.numnumdef__rsub__(self,other):returnother-self.numdef__rmul__(self,other):returnother*self.numdef__rtruediv__(self,other):returnother/self.num nNumber(6)print(4-n)# -2 4 - 6 -2print(4*n)# 24print(3/n)# 0.5要点反向方法使得运算符两侧操作数类型不对等时仍能正确完成运算从而实现对称性。三、综合案例分数类Fraction的实现以下示例综合运用上述魔术方法构建一个支持四则运算、自动约分、并能与整数、浮点数及布尔值混合运算的分数类。辅助函数# 求最大公约数用于约分需处理负数defget_gcd(a,b):foriinrange(min(abs(a),abs(b)),0,-1):ifnota%iandnotb%i:return-iifa0andb0elseireturnb# 保底# 类型转换适配器将 int/float 统一转为 Fraction 对象defget_frac(obj):ifisinstance(obj,Fraction):returnobjelifisinstance(obj,int):returnFraction(obj,1)elifisinstance(obj,float):decimal_strstr(obj).split(.)[-1]b10**len(decimal_str)returnFraction(int(obj*b),b)raiseTypeError(类型错误仅支持 int、float、Fraction)分数类主体classFraction:def__init__(self,a,b):gcdget_gcd(a,b)self.aa//gcd self.bb//gcddef__repr__(self):# 规范化输出格式处理分母为 ±1 或负数的情形ifself.b1:returnstr(self.a)ifself.b-1:returnstr(-self.a)ifself.b0:returnf{self.a}/{self.b}returnf{self.a}/{self.b}# ---- 正向算术运算 ----def__add__(self,other):otherget_frac(other)returnFraction(self.a*other.bother.a*self.b,self.b*other.b)def__sub__(self,other):otherget_frac(other)returnFraction(self.a*other.b-other.a*self.b,self.b*other.b)def__mul__(self,other):otherget_frac(other)returnFraction(self.a*other.a,self.b*other.b)def__truediv__(self,other):otherget_frac(other)returnFraction(self.a*other.b,self.b*other.a)# ---- 反向算术运算支持左侧为 int/float/bool ----def__radd__(self,other):otherget_frac(other)returnFraction(other.a*self.bother.b*self.a,other.b*self.b)def__rsub__(self,other):otherget_frac(other)returnFraction(other.a*self.b-other.b*self.a,other.b*self.b)def__rmul__(self,other):otherget_frac(other)returnFraction(other.a*self.a,other.b*self.b)def__rtruediv__(self,other):otherget_frac(other)returnFraction(other.a*self.b,other.b*self.a)测试验证f1Fraction(3,4)f2Fraction(2,3)print(f1f2)# 17/12print(f1-f2)# 1/12print(f1*f2)# 1/2print(f1/f2)# 9/8print(f13)# 15/4print(f1-3.2)# -49/20 0.75 - 3.2 -2.45 -49/20print(f1*False)# 0print(f1/True)# 3/4# 反向运算print(3f1)# 15/4print(3.2-f1)# 49/20print(True*f1)# 3/4print(False/f1)# 0该示例系统性地运用了正向和反向算术方法并通过get_frac实现了对整数和浮点数的无缝适配具有较好的扩展性。四、常用魔术方法速查表方法触发时机说明__init__实例化obj Class(...)初始化实例属性__call__实例对象作为函数调用obj()使对象可调用__getitem__下标访问obj[key]支持[]操作__repr__repr(obj)、交互式环境直接输出面向开发者应信息详尽__str__str(obj)、print(obj)、f-string面向用户宜简洁可读__add__加法实例在左正向加法__radd__加法实例在右左侧非本类反向加法__sub__/__rsub__减法正向/反向__mul__/__rmul__乘法正向/反向__truediv__/__rtruediv__真除法/正向/反向Python 3 中/即为真除此外还有__floordiv__//、__mod__%、__pow__**等其机制与上述方法同构可触类旁通。五、总结与实践建议魔术方法是 Python 面向对象编程中自定义行为的重要工具。合理运用它们可以使自定义类具备与内置类型一致的操作语法从而提升代码的表达力和可维护性。学习路径建议初级阶段重点掌握__init__、__str__、__add__等最常用方法。进阶阶段按需查阅文档补充实现反向运算、比较运算、迭代协议、上下文管理等。实践方式自行实现如二维向量Vector2D、复数、矩阵等数学对象在具体场景中体会魔术方法的协作机制。P.S.魔术方法并非不可捉摸的“黑魔法”而是 Python 语言规范中预留的扩展接口。规范使用它们是编写 Pythonic 代码的重要一环。如需进一步探讨其他方法如比较运算符、迭代器协议、上下文管理器等欢迎继续交流。祝编码顺利。下图为本文知识点的思维导图示意