我正在开发一个小项目,我必须使用方法重载 mul 方法。但 mul 方法有不同的参数。
方法可以取2参数1st是self,2nd是Instance或integer。 因此,当Method将第二个参数作为Instance时,它会给我一个错误。 这是我的代码
import math
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __mul__(self,v1):
x = self.x * v1.x
y = self.y * v1.y
return Vector(x,y)
def __mul__(self,n):
x = self.x*n
y = self.y*n
return Vector(x,y)
v1 = getVector()
v2 = getVector()
v3 = v1 * v2
v4 = 1
v5 = getVector()
v6 = v4 * v5
因此,当我尝试运行该程序时,我收到错误
File "Al.py", line 102, in <module>
main()
File "Al.py", line 88, in main
mul()
File "Al.py", line 47, in mul
v3 = v1 * v2
File "Al.py", line 21, in __mul__
x = self.x*n
有人可以帮我理解这个吗?如何在不对方法签名进行任何更改的情况下调用重载方法?
答案 0 :(得分:2)
正如评论中所提到的,Python不支持方法重载。相反,您必须检查函数体中的参数以确定如何继续。
请注意,您通常不会检查参数的类型,而是检查行为。例如,
def __mul__(self, other):
try:
try:
x = self.x * other.x
y = self.y * other.y
except AttributeError:
x = self.x * other
y = self.y * other
except Exception:
return NotImplemented
return Vector(x, y)
__rmul__ = __mul__ # Allows 4 * v, not just v * 4
__mul__
的第二个参数不一定只是一个数字或Vector
;它可以是任何类似的,足以使尝试的乘法成功。
在涉及乘法的任何其他错误上,返回NotImplemented
以便可以尝试type(other).__rmul__
。
如果您确实需要区分不同类型的参数,请使用isinstance
:
def __mul__(self, other):
if isinstance(other, int):
x = self.x * other
y = self.y * other
elif isinstance(other, Vector):
x = self.x * other.x
y = self.y * other.y
else:
return NotImplemented
return Vector(x, y)