1. 特殊方法是交给Python解释器使用的,而不是自己
2. 特殊方法是隐式调用的,例如 for i in x: 其实在背后调用iter(x),接着调用x.__iter__(如果存在该方法)或者x.__getitem__(不存在__iter__)
3. 编程中大部分时间是用来实现特殊方法,而不是调用特殊方法,除了__init__外的特殊方法基本上都是通过内置函数来隐式调用的
三、 模拟数值类型
import math
classVector:# 创建对象时需要传入两个参数,一个x,代表横坐标,一个y,代表纵坐标def__init__(self, x =0, y =0):
self.x = x
self.y = y
# 特殊方法,可以在打印对象或调用str方法时自动调用该方法def__repr__(self):returnf'Vector({self.x}, {self.y})'# 特殊方法,在调用abs(对象)时会自动调用该方法def__abs__(self):return math.hypot(self.x, self.y)# 特殊方法,在调用bool(对象)时会自动调用该方法def__bool__(self):# 判断坐标是否为(0,0) 不是则正确,是则错误return self.x !=0or self.y !=0# 两个Vector对象使用+号时自动调用,+号前面为self,+号后面为otherdef__add__(self, other):
x = self.x + other.x
y = self.y + other.y
# 此处返回的是一个新的Vector对象,原始对象的数值不会发生任何改变return Vector(x, y)# Vector * x , x在方法中只能是一个具体的数值,不能是对象def__mul__(self, other):# 此处返回的也是一个新的Vector对象,原始对象不会发生任何改变return Vector(self.x * other, self.y * other)