Python泛型函数与单分发器

这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:

from functools import singledispatch

@singledispatch

def fun(arg, verbose=False):

    '''如果没有合适的函数,就调用这个函数'''

    if verbose:

        print('Let me just say,', end=' ')

    print(arg)

#把register当做修饰器使用,为不同类型参数分别创建不同的实现

#使用下划线表示不关心函数的具体名字

@fun.register(int)

def _(arg, verbose=False):

    '''如果第一个参数的类型是int,就调用这个函数'''

    if verbose:

        print('Strength in numbers, eh?', end=' ')

    print(arg)

#也可以为函数起个名字

@fun.register(float)

def fun_num(arg, verbose=False):

    '''如果第一个参数的类型是float,就调用这个函数'''

    if verbose:

        print('Half of your number is:', end=' ')

    print(arg/2)

@fun.register(list)

@fun.register(tuple)

def _(arg, verbose=False):

    '''如果第一个参数的类型是list或tuple,就调用这个函数'''

    if verbose:

        print('Enumerate this:')

    for i, v in enumerate(arg):

        print(i, v)

#自定义类

class Scores:

    def __init__(self, *score):

        self.score = list(score)

#为自定义类型创建泛型函数

@fun.register(Scores)

def _(arg, verbose=False):

    if verbose:

        print('The scores are:')

    for sc in arg.score:

        print(sc, end=' ')

#如果第一个参数是None的类型,就调用这个函数

def doNothing(arg, verbose=False):

    print('Nothing to do.')

#可以把register()当做函数使用来注册指定类型

fun.register(type(None), doNothing)

#调用原始函数

fun('Hello world.')

#调用针对整型参数的函数

fun(666, True)

#调用针对实型参数的函数

fun(6.66)

#调用针对列表和元组参数的函数

fun(list(range(5, 10)))

fun(tuple(range(10, 15)))

#调用针对None类型参数的函数doNothing()

fun(None)

#调用原始函数

fun({1,2,3},True)

#调用针对自定义类型Scores参数的函数

fun(Scores(1, 2, 3, 4, 5))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值