写点什么

python 小知识 -python 泛函数

  • 2022 年 7 月 04 日
  • 本文字数:716 字

    阅读完需:约 2 分钟

python小知识-python泛函数

java 中泛型(generic)泛型 被用于支持根据不同类型输入参数的函数或者类,比如 Class 或者 List , 在调用实例化是才传入实际类型的 T。


python 中的标准模块 functools 的装饰器 singledispatch 也提供了类似的功能,通过 singledispatch 装饰器可以把不同函数变成支持泛型的泛函数,可以支持同一个函数,支持不同的类型输入。


我们通过例子来一探 singledispatch 的究竟。


def display_int(info):  print(info, type(info), "this is a int")def display_str(info):  print(info, type(info), "this is a str")
display_int(5)display_int('name')
复制代码

由于 python 是动态语言,不支持重载,不会根据不同类型来选择调用同一个名字不同类型参数的函数。如上面例子所示,只能显式的声明两个函数 display_int 和 disply_str。如果有很多类型,则需要大量的函数和函数名。

一种解决办法是一个函数,在函数里做类型判断。同样的问题,如果有很多类型,写长长的 if else 串。


def display(info):    if isinstance(info, int):        print(info, type(info), "this is a int")    elif isinstance(info, str):      print(info, type(info), "this is a str")display(5)display('name')
复制代码


另外一种解决方案就是 singledispatch, 可用 singledispatch 去装饰一个默认类型的函数,然后需要接收不同类型时,通过该函数名去注册.register(int)


from functools import singledispatch
@singledispatchdef display(info): print(info, type(info), "this is a obj")@display.register(int)def _(info): print(info, type(info), "this is a int") @display.register(str)def _(info): print(info, type(info), "this is a str")
display(5)display('name')
复制代码





发布于: 刚刚阅读数: 3
用户头像

公众号:人工智能微客(weker) 2019.11.21 加入

人工智能微客(weker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python小知识-python泛函数_Python_AIWeker-人工智能微客_InfoQ写作社区