按类型的重载功能

时间:2019-04-29 05:20:14

标签: python-3.x overloading

由于python 3.5函数参数可以使用类型声明,但是似乎不支持按参数类型重载。具体来说,我有一个旧的类定义

class Supplies:
    def __init__(self, supp):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp

,并希望将构造函数转换为使用类型声明。像这样:

class Supplies:
    def __init__(self, supp: List[int]):
        self.food = supp[0]
        self.water = supp[1]
    def __init__(self, supp: int):
        self.food = supp
        self.water = supp

,不同之处在于它会覆盖而不是重载__init__。在这里有一个明智的解决方法(因为它是构造函数,所以我不能简单地使用两个不同的函数名)?

1 个答案:

答案 0 :(得分:1)

找到了公开所需界面的解决方案:

SupplyData = TypeVar('SupplyData', List[int], int)
class Supplies:
    def __init__(self, supp: SupplyData):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp

或具有上面注释中建议的匿名类型:

class Supplies:
    def __init__(self, supp: Union[List[int], int]):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp