时间:2021-05-22
假设你有一个函数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@singledispatchdef connect(address): print(f' 传输参数类型为:{type(address)},不是有效类型')@connect.registerdef _(address: str): ip, port = address.split(':') print(f'参数为字符串,IP是:{ip}, 端口是:{port}')@connect.registerdef _(address: tuple): ip, port = address print(f'参数为元组,IP是:{ip}, 端口是:{port}')connect('123.45.32.18:8080')connect(('123.45.32.18', 8080))connect(123)我们运行一下这段代码,大家看看根据参数的不同,有什么样的不同效果:
可以看到,我们调用的函数,始终都是 connect ,但是由于传入参数的类型不同,它运行的结果也不一样。
我们使用 singledispatch 装饰一个函数,那么这个函数就是我们将会调用的函数。
这个函数在传入参数不同时的具体实现,通过下面注册的函数来实现。注册的时候使用 @我们定义的函数名.register 来注册。被注册的函数名叫什么无关紧要,所以这里我都直接使用下划线代替。
被注册的函数的第一个参数,通过类型标注来确定它应该使用什么类型。当我们调用我们定义的函数是,如果参数类型符合某个被注册的函数,那么就会执行这个被注册的函数。如果参数类型不满足任何一个被注册的函数,那么就会执行我们的原函数。
使用类型标注来指定参数类型是从 Python 3.7才引入的新特性。在 Python 3.6或之前的版本,我们需要通过 @我们定义的函数名.register(类型) 来指定类型,例如:
from functools import singledispatch@singledispatchdef 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}')同时,还有一个需要注意的点,就是只有第一个参数的不同类型会被重载。后面的参数的类型变化会被自动忽略。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python中没有函数重载为了考虑为什么python不提供函数重载,首先我们要研究为什么需要提供函数重载。函数重载主要是为了解决两个问题:可变参数类型。可变参数
本文实例讲述了Python运算符重载用法。分享给大家供大家参考。具体分析如下:python中,我们在定义类的时候,可以通过实现一些函数来实现重载运算符。例子如下
在JavaScript中,函数function就是对象。JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念。 例子:复制代码代码如下
函数重载:在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,即函数重载。重载的实现:几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自
实现加法(__add)重载代码示例:复制代码代码如下:dolocalInfor_class={};functionInfor_class.create(_t)l