参数不同时,方法重载不起作用

时间:2017-12-02 01:12:25

标签: python overloading

我正在开发一个小项目,我必须使用方法重载 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

有人可以帮我理解这个吗?如何在不对方法签名进行任何更改的情况下调用重载方法?

1 个答案:

答案 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)