Python中的singledispatch

360 阅读1分钟

Python中的@functools.singledispatch可以实现类似多态的效果。比如:

@singledispatch
def add(a, b):
    return a + b

@add.register(int)
def _(a, b):
    return a + b

@add.register(str)
def _(a, b):
    return a +  " | " + b

@add.register(list)
def _(a, b):
    return a + b + ["end"]

调用add时, 传入的类型不同, 调用的方法也不一样

add(1, 2)
3
add('1', '2')
1 | 2
add(['1'], ['2'])
['1', '2', 'end']

其中下划线_函数命名方式并没有什么问题, 因为它是 @add.register(list) 这个"函数"的入参, 叫什么名字并不重要。