前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python泛型函数与单分发器

Python泛型函数与单分发器

作者头像
Python小屋屋主
发布2018-04-16 15:49:40
2.2K0
发布2018-04-16 15:49:40
举报
文章被收录于专栏: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))

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档