在执行函数重载时,关于python中的位置参数的错误

时间:2019-07-20 06:37:39

标签: python-3.x overloading

我一直在使用函数来实现函数重载,以查找各种图形(包括正方形,圆形和矩形)的面积,但是当我尝试实现此概念时,这就是我得到的错误。

我创建了一个类的实例,然后尝试调用所有具有不同参数数量的函数。但是我仍然遇到很多错误。

from abc import abstractmethod
class Poly:
    def __init__(self,n=0):
        self._n = n

    def area(self,a):
        if isinstance(r,int):
            return a ** 2

    def area(self,b,pi):
        if isinstance(a,float):
            ar = pi * b * b
        return ar

    def area(self,l,r,ar):
        if isinstance(l,int) and isinstance(r,int):
            ar = l * r
            return l*r

if __name__ == '__main__':
    p = Poly()
    pi = 3.14
    ar = 0
    l = 3
    r = 4
    b = 10
    a = 2
    peroi1 = p.area(a)
    print(peroi1)
    peroi2 = p.area(b,pi)
    print(peroi2)
    peroi3 = p.area(l,r,ar)
    print(peroi3)

预期输出应分别给出正方形,圆形和矩形的面积,但出现以下错误。

Traceback (most recent call last):
  File "overloadpractice.py", line 28, in <module>
    peroi1 = p.area(a)
TypeError: area() missing 2 required positional arguments: 'r' and 'ar'

1 个答案:

答案 0 :(得分:0)

您可以执行类似的操作,但是有更好的方法。稍后我会提出一个更好的例子:

class Poly:
    def __init__(self, n=0):
        self._n = n

    def area(self, *args):
        if len(args) == 1:
            if isinstance(a, int):
                return r ** 2

        elif len(args) == 2:
            if isinstance(a, float):
                return pi * b * b

        elif len(args) == 3:
            if isinstance(l, int) and isinstance(r, int):
                ar = l * r
                return l*r

        else:
            return 'invalid number of arguments'


if __name__ == '__main__':
    pi = 3.14
    ar = 0
    l = 3
    r = 4
    b = 10
    a = 2

    p = Poly()

    peroi1 = p.area(a)
    print(peroi1)
    peroi2 = p.area(b, pi)
    print(peroi2)
    peroi3 = p.area(l, r, ar)
    print(peroi3)

更好(更易于测试和维护)的示例:

from math import pi

SQUARE = 1
CIRCLE = 2
RECTANGLE = 3

get_area = {
    SQUARE: lambda side :  side * side,
    CIRCLE: lambda radius, _ : pi * radius * radius,
    RECTANGLE: lambda length, width, _ : length * width 
}

class Poly:
    def __init__(self, n=0):
        self._n = n

    def area(self, *args):
        return get_area.get(len(args), lambda: 'invalid number of arguments')(*args)

if __name__ == '__main__':
    ar = 0
    l = 3
    r = 4
    b = 10
    a = 2
    # moved pi to an import
    square = Poly()
    circle = Poly()
    rectangle = Poly()

    print(square.area(a))            # 4  
    print(circle.area(b, pi))        # 14.1592653589793
    print(rectangle.area(l, r, ar))  # 12
    print(square.area())             # invalid number of variables