python实现泛型函数
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型。 ——来自百度
简易理解:泛型函数就是你定义函数的时候, 能接收万能类型, 在调用时, 会根据传入值本身的类型进行区分处理, 达到某些效果, 好处是代码复用率高, 减少代码冗余, 对面向对象语言中泛型函数概念非常常用.
接下来使用到的py库 functools
中的 singledispatch
模块
使用方法:
在需要进行泛型的函数上加上装饰器即可
from functools import singledispatch
@singledispatch
def add(obj):
return obj
- 1
- 2
- 3
- 4
- 5
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类型
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
根据输入的内容进行判断类型输出
对象中使用
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类型
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
不调用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]))
结果与上方一样, 按需选择
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
例子很简单, 最后多用于tcp/ip接收判断使用
提示: bool类型也是可以的o,完!