模拟一个二位向量的基本代码如下

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中得到验证

python 向量2范数 python 向量的模_类

 

bool的魔术方法也可以换一种方法实现

def __bool__(self):
        print('__bool__')
        return bool(self.x or self.y)

当调用print(bool(a))时,结果一样

python 向量2范数 python 向量的模_魔术方法_02

 

repr魔术方法如果不重载实现,打印效果如下

python 向量2范数 python 向量的模_ubuntu_03

所以重载该魔术方法后,在终端打印对象时,打印结果会更加清晰

重载魔术方法主要就是为了实现自己的类,从而让类的表述更加清晰明确

 

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出