981377660LMT / ts

ts学习
6 stars 1 forks source link

python 中的 @overload #612

Open 981377660LMT opened 1 month ago

981377660LMT commented 1 month ago

https://adamj.eu/tech/2021/05/29/python-type-hints-how-to-use-overload/

比较难用出来,因为重载参数名称必须相同

981377660LMT commented 1 month ago

https://stackoverflow.com/questions/6434482/python-function-overloading

981377660LMT commented 1 month ago

Python 是一种动态类型语言,因此重载的概念根本不适用于它。 我们应该能够在 Python 中执行多种方法,或者也称为:多重分派(Multiple dispatch)。

981377660LMT commented 1 month ago

singleDispatch 和 multiDispatch 是什么

981377660LMT commented 1 month ago

单分派(Single Dispatch)和多分派(Multiple Dispatch)是面向对象编程中的两种方法分派机制。

单分派(Single Dispatch) 单分派是指方法的调用仅根据一个参数(通常是接收者对象)的类型来决定具体调用哪个方法。在大多数面向对象编程语言中,单分派是默认的分派机制。例如,在 Python 中,方法调用是基于对象的类型来决定的。

示例:

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def make_animal_speak(animal: Animal):
    return animal.speak()

dog = Dog()
cat = Cat()

print(make_animal_speak(dog))  # 输出: Woof!
print(make_animal_speak(cat))  # 输出: Meow!

多分派(Multiple Dispatch) 多分派是指方法的调用根据多个参数的类型来决定具体调用哪个方法。这种机制允许方法根据多个参数的类型进行分派,从而实现更灵活的多态行为。Python 中可以使用 multipledispatch 库来实现多分派。

示例:

from multipledispatch import dispatch

@dispatch(int, int)
def add(a, b):
    return a + b

@dispatch(str, str)
def add(a, b):
    return a + b

@dispatch(list, list)
def add(a, b):
    return a + b

print(add(1, 2))        # 输出: 3
print(add("hello", " world"))  # 输出: hello world
print(add([1, 2], [3, 4]))     # 输出: [1, 2, 3, 4]

在这个例子中,add 函数根据传入参数的类型不同,调用不同的实现。