Python中的特殊方法以及应用详解
前言
Python中的特殊方法主要是为了被解释器调用的,因此应该尽量使用len(my_object)而不是my_object.__len__()这种写法。在执行len(my_object)时,Python解释器会自行调用my_object中实现的__len__方法。
除非有大量的元编程存在,直接调用特殊方法的频率应远小于实现它们的次数。
模拟数值类型
可以通过在自定义对象中实现__add__和__mul__等特殊方法,令其支持+、*等运算符。
如下面的模拟向量的Vector类:
#vector.py frommathimporthypot classVector: def__init__(self,x=0,y=0): self.x=x self.y=y def__repr__(self): returnf'Vector({self.x},{self.y})' def__abs__(self): returnhypot(self.x,self.y) def__bool__(self): returnbool(self.xorself.y) def__add__(self,other): returnVector(self.x+other.x,self.y+other.y) def__mul__(self,scalar): returnVector(self.x*scalar,self.y*scalar)
运行效果如下:
>>>fromvectorimportVector
>>>v1=Vector(2,4)
>>>v2=Vector(2,1)
>>>v1+v2
Vector(4,5)
>>>v=Vector(3,4)
>>>abs(v)
5.0
>>>v*3
Vector(9,12)
对象的字符串表示
Python有一个repr内置函数,能把一个对象用字符串的形式表示出来。实际上这种字符串表达是通过对象内部的__repr__特殊方法定义的。默认情况下,在控制台里查看某个对象时,输出的字符串一般是
__repr__返回的字符串应该准确、无歧义,并尽可能表示出该对象是如何创建的。比如前面的Vector对象,其__repr__中定义的字符串形式类似于Vector(3,4),和对象初始化的语法非常近似。
__repr__和__str__的区别在于,__str__是在向对象应用str()函数(或者用print函数打印某个对象)时被调用。其返回的字符串对终端用户更友好。
如果只想实现其中一个特殊方法,__repr__应该是更优的选择。在对象没有实现__str__方法的情况下,Python解释器会用__repr__代替。
#myclass.py classMyClass: def__repr__(self): return'MyClass' def__str__(self): return'ThisisaninstanceofMyClass'
>>>frommyclassimportMyClass >>>my=MyClass() >>>my MyClass >>>print(my) ThisisaninstanceofMyClass
自定义布尔值
Python里有bool类型,但实际上任何对象都可以用在需要bool类型的上下文(比如if或while语句)中。为了判断某个值x的真假,Python会调用bool(x)返回True或False。
默认情况下,自定义类的实例总是为真。除非这个类对于__bool__或__len__方法有自己的实现。
bool(x)实际上调用了对象x中的__bool__方法。如不存在__bool__方法,则bool(x)会尝试调用x.__len__(),返回0则为False,否则为True。
#boolclass.py classBoolClass: def__init__(self): self.list=[] defadd(self,item): self.list.append(item) def__len__(self): returnlen(self.list)
>>>fromboolclassimportBoolClass >>>b=BoolClass() >>>len(b) 0 >>>bool(b) False >>>b.add(1) >>>len(b) 1 >>>bool(b) True
#boolclass.py classBoolClass: def__init__(self): self.list=[] defadd(self,item): self.list.append(item) def__len__(self): returnlen(self.list) def__bool__(self): returnbool(sum(self.list))
>>>fromboolclassimportBoolClass >>>b=BoolClass() >>>b.add(1) >>>len(b) 1 >>>bool(b) True >>>b.add(-1) >>>len(b) 2 >>>bool(b) False
参考资料
FluentPython
总结
到此这篇关于Python中特殊方法以及应用详解的文章就介绍到这了,更多相关Python特殊方法及应用内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!