使用python实现泛型函数

python实现泛型函数

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型。 ——来自百度

简易理解:泛型函数就是你定义函数的时候, 能接收万能类型, 在调用时, 会根据传入值本身的类型进行区分处理, 达到某些效果, 好处是代码复用率高, 减少代码冗余, 对面向对象语言中泛型函数概念非常常用.

接下来使用到的py库 functools 中的 singledispatch 模块

使用方法:

在需要进行泛型的函数上加上装饰器即可
from functools import singledispatch
@singledispatch
def add(obj):
    return obj

1 singledispatch : 标记处理函数传值类型

2 register(类型): 为传值判断类型后输出结果

3 后续使用无需写函数名, 只要有register(类型装饰器)即可调用

4 定义需要判断的类型int str tuple dict list set 根据自己需求

5

使用:

函数中实现类型判断

from functools import singledispatch
@singledispatch
def add(obj):
    return obj

int类型
@add.register(int)
def _(add):
    print("int类型")

@add.register(str)
def _(add):
    print("str类型")
    
@add.register(list)
def _(add):
    print("list类型")
    
@add.register(tuple)
def _(add):
    print("tuple类型")
    
@add.register(dict)
def _(add):
    print("dict类型")
    
@add.register(set)
def _(add):
    print("set类型")
    
add([1,2,3])  

输出结果: list类型

根据输入的内容进行判断类型输出

对象中使用

from functools import singledispatch
class Type:
    @singledispatch
    def add(obj):
        return obj
    @add.register(int)
    def _(add):
        print("int类型")
    @add.register(str)
    def _(add):
        print("str")
    @add.register(list)
    def _(add):
        print("list类型")
    @add.register(tuple)
    def _(add):
        print("tuple类型")
    @add.register(dict)
    def _(add):
        print("dict类型")
    @add.register(set)
    def _(add):
        print("set类型")
Type.add([1,2,3])

输出结果:list类型

不调用singledispatch模块实现泛型函数

这里需要实现一个类型拼接操作, 如下代码

在此之前需要先定义一个装饰器, 来判断两个类型是否相同, 如果不同则不作后续判断, 节省资源消耗

def check_type(func):
    def wrapper(*args, **kwargs):
        args1, args2 = args[:2]
        if type(args1) != type(args2):
            return "两种类型不一致, 不能做拼接"
        return func(*args, **kwargs)
    return wrapper


@check_type
def add(obj1, obj2):
    if isinstance(obj1,list):
        obj1 += obj2
        return obj1
    if isinstance(obj1, str):
        obj1 += obj2
        return obj1
    if isinstance(obj1, tuple):
        obj1 += obj2
        return obj1
    if isinstance(obj1, dict):
        obj1 += obj2
        return obj1


print(add([1, 2, 3], [1, 2, 3]))

结果与上方一样, 按需选择

例子很简单, 最后多用于tcp/ip接收判断使用

提示: bool类型也是可以的o,完!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值