最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何在Python中实现函数重载

    正文概述    2020-07-05   245

    如何在Python中实现函数重载

    假设你有一个函数connect,它有一个参数address,这个参数可能是一个字符串,也可能是一个元组。例如

    connect('123.45.32.18:8080')
    connect(('123.45.32.18', 8080))

    你想在代码里面兼容这两种写法,于是你可能会这样写代码:

    def connect(address):
        if isinstance(address, str):
            ip, port = address.split(':')
        elif isinstance(address, tuple):
            ip, port = address
        else:
            print('地址格式不正确')

    这种写法简单直接,但是如果参数的类型更多,那么你就需要写很长的 if-elif-elif-...-else。代码看起来就非常不美观。

    学习过 Java 的同学,应该对函数重载比较熟悉,可以定义几个名字相同的函数,但是他们的参数类型或者数量不同,从而实现不同的代码逻辑。

    在 Python 里面,参数的数量不同可以使用默认参数来解决,不需要定义多个函数。那如果参数类型不同就实现不同的逻辑,除了上面的 if-else外,我们还可以使用functools模块里面的singledispatch装饰器实现函数重载。

    我们来写一段代码:

    from functools import singledispatch
    
    @singledispatch
    def connect(address):
        print(f' 传输参数类型为:{type(address)},不是有效类型')
    
    @connect.register
    def _(address: str):
        ip, port = address.split(':')
        print(f'参数为字符串,IP是:{ip}, 端口是:{port}')
    
    @connect.register
    def _(address: tuple):
        ip, port = address
        print(f'参数为元组,IP是:{ip}, 端口是:{port}')
    
    connect('123.45.32.18:8080')
    connect(('123.45.32.18', 8080))
    connect(123)

    我们运行一下这段代码,大家看看根据参数的不同,有什么样的不同效果:

    如何在Python中实现函数重载

    可以看到,我们调用的函数,始终都是connect,但是由于传入参数的类型不同,它运行的结果也不一样。

    我们使用singledispatch装饰一个函数,那么这个函数就是我们将会调用的函数。

    这个函数在传入参数不同时的具体实现,通过下面注册的函数来实现。注册的时候使用@我们定义的函数名.register来注册。被注册的函数名叫什么无关紧要,所以这里我都直接使用下划线代替。

    被注册的函数的第一个参数,通过类型标注来确定它应该使用什么类型。当我们调用我们定义的函数是,如果参数类型符合某个被注册的函数,那么就会执行这个被注册的函数。如果参数类型不满足任何一个被注册的函数,那么就会执行我们的原函数。

    使用类型标注来指定参数类型是从 Python 3.7才引入的新特性。在 Python 3.6或之前的版本,我们需要通过@我们定义的函数名.register(类型)来指定类型,例如:

    from functools import singledispatch
    
    @singledispatch
    def connect(address):
        print(f' 传输参数类型为:{type(address)},不是有效类型')
    
    @connect.register(str)
    def _(address):
        ip, port = address.split(':')
        print(f'参数为字符串,IP是:{ip}, 端口是:{port}')
    
    @connect.register(tuple)
    def _(address):
        ip, port = address
        print(f'参数为元组,IP是:{ip}, 端口是:{port}')

    同时,还有一个需要注意的点,就是只有第一个参数的不同类型会被重载。后面的参数的类型变化会被自动忽略。


    下载网 » 如何在Python中实现函数重载

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元