模拟一个二位向量的基本代码如下
import math as m
class vector2d():
def __init__(self, x, y):
print('__init__')
self.x=x
self.y=y
def __abs__(self):#执行abs函数时自动调用
print("__abs__")
return m.hypot(self.x, self.y)#hypot() 返回欧几里德范数 sqrt(x*x + y*y)。
def __bool__(self):#执行bool函数时自动调用
print('__bool__')
return bool(abs(self))
def __add__(self, other):#两个对象相加时自动调用
print("__add__")
x=self.x+other.x
y=self.y+other.y
return vector2d(x,y)
def __mul__(self, factor):#一个对象乘以一个系数时自动调用
print('__mul__')
return vector2d(self.x*factor,
self.y*factor)
def __repr__(self):#打印对象时自动调用
print('__repr__')
return 'vector2d(%r, %r)' % (self.x, self.y)
a=vector2d(10, 20);
print("-----------------")
print(a)
print("-----------------")
print(abs(a))
print("-----------------")
print(bool(a))
print("-----------------")
print(a*10)
print("-----------------")
b=vector2d(30,40)
print(a+b)
在类中实现的魔术方法已经在打印的log中得到验证
bool的魔术方法也可以换一种方法实现
def __bool__(self):
print('__bool__')
return bool(self.x or self.y)
当调用print(bool(a))时,结果一样
repr魔术方法如果不重载实现,打印效果如下
所以重载该魔术方法后,在终端打印对象时,打印结果会更加清晰
重载魔术方法主要就是为了实现自己的类,从而让类的表述更加清晰明确
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出