1 Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作。而这些特殊方法的命名以两个下划线开头,以两个下划线结尾( __xxx__)
比如obj[key]的背后就是__getitem__方法,为了求得my_collection[key]的值,解释器实际上会调用my_collection.__getitem__(key)
2 元组for循环例子,支持多个for
self._cards = [Card(rank,suit) for suit in self.suits for rank in self.ranks]
3 对象的特殊方法的存在只是为了被Python解释器调用的。
4 例子
from math import hypot
class Vector:
def __init__(self,x=0,y=0):
self.x = x
self.y = ydef __repr__(self): # 该函数定义字符串的表示形式,如果没有它,print(v) 只会输出<__main__.Vector object at 0x102406310>,v为Vector对象。
return 'Vector(%r, %r)' % (self.x,self.y) # %r输出对象,在Golang中%v输出对象def __abs__(self):
return hypot(self.x,self.y)def __bool__(self):
return bool(abs(self))def __add__(self,other):
x = self.x + other.x
y = self.y = other.y
return Vector(x,y)
def __mul__(self,scalar):
return Vector(self.x*scalar,self.y*scalar)v = Vector(1,2)
print(v)
5 __repr__ 和 __str__的区别在于,后者是在str() 函数或print() 函数调用时调用,并且返回的字符串对终端用户更友好。
如果只想实现其中一个,__repr__是更好的选择。
6 bool(x) 的背后是调用x.__bool__()的结果,如果不存在__bool__(),则会尝试调用x.__len__(),返回0表示False,否则表示True。
7 特殊方法预览