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 根据自己需求

函数中实现类型判断

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类型也是可以的,完!

Python泛型思考

近日在学习Python内容时学习到了泛型,但从个人看法来说Python泛型与Java的泛型有很大的不同,在此提出一点个人的看法

首先,针对Java的泛型,其主要作用是作为某些以后才指定类型的替代,在编写过程中这些泛型可以在实例化过程中由参数指定,典型例子如集合类当中的泛型

List<String> list = new ArrayList<String>()

这就相当于指定了该集合类的新类型。泛型使用的原因是可以加强类型转化的安全性以及减少转换的次数。比如在上例中的List集合中,如果从中取出一个元素,在未指明泛型的前提下,取出的类型元素只能是Object,必须使用强制类型转换转化为对应的类型才能供后续代码使用。

那么,此处就可能存在问题,因为没有指明泛型,那么意味着加入集合的时候只要你的元素类型是Object即可加入,由于在Java中Object为最高基类,意味着任何元素都可加入泛型当中,由此,没有任何办法保证你取出的元素一定是你想要的的类型,所以此时为保证程序健壮性必须处理ClassCastException异常;但在指明泛型后,由于出入都可以限制元素类型,所以减少了此种转换的异常,也就保证了转换的安全性。

由以上描述可以知道,泛型首先要求的是你能够在实例化时指定类型,所以泛型一般应用于强类型的语言当中才比较好用,但Python本身是弱类型语言,所以Python的泛型并不完全是这种作用

Python的泛型类Generic的注释中提到,

A generic type is typically declared by inheriting from an instantiation of this class with one or more type variables.

也就是说,Python 的泛型类型是继承这个类之后才会声明,这种声明方式与Python的抽象类声明方式十分类似。以IO下的三个实现类为例,其声明分别为

class IO(Generic[AnyStr]):
class BinaryIO(IO[bytes]):
class TextIO(IO[str]):

从这些定义中可以看出,在声明泛型类之后IO类便可以使用泛型的方式去作为其他类的基类定义,

并且AnyStr在Python的类型声明中是包含了bytes与str两类的,由此我们可以发现Python的泛型与Java泛型的一个最根本区别:Python 的泛型是在声明时就指定了泛型类型,也就是说,Python的泛型类型主要作用是:某个类存在多种使用场景,并且我们可以预知各个使用场景的类型,为了将原始代码能够广泛应用于其他场景上使用泛型去保障代码在各个场景上的通用性。因此,在泛型类的声明中并不像其他语言一样使用类似T的方式去替代类型,而是直接使用已经声明的泛型类型在代码中书写,如readline函数的定义

    @abstractmethod
    def readline(self, limit: int = -1) -> AnyStr:
        pass

由此,我们可以归纳Python泛型的两个条件:

1.继承Generic类,并在类的参数中指明泛型类型

2.在实现中使用泛型类型参与代码编写

最后,由于在声明时就已经指定了泛型的类型,所以Python泛型更大程序上我认为是一个具有辅助说明的功能,相当于说明在编写当中告诉编程人员应当使用什么类型,这其实从另一个层面上也是在其他语言中泛型功能的一大体现 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

使用python如何实现泛型函数的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  4. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  7. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  8. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  9. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

  10. 在android studio中使用python代码构建android应用程序

    我有一些python代码和它的机器人,我正在寻找一种方法来使用android项目中的那些python代码.有没有办法做到这一点!?解决方法有两种主要工具可供使用,它们彼此不同:>QPython>Kivy使用Kivy,大致相同的代码也可以部署到IOS.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部