python 重载的实现(single-dispatch generic function)

DAY 11. python 重载

函数重载是指允许定义参数数量或类型不同的同名函数,程序在运行时会根据所传递的参数类型选择应该调用的函数
,但在默认情况下,python是不支持函数重载的,定义同名函数会发生覆盖

def foo(a:int):print(f'int {a}')def foo(b:list):print(f'list{b}')foo(3)
foo([i for i in range(3)])# list3
# list[0, 1, 2]

至于不支持的原因,我想大概是没必要,首先,只在两种情况下可能发生函数重载,一是参数类型不同,二是参数个数不同,对于第一种情况,鸭子类型的存在使得函数不在乎参数类型而只关心参数的行为,所以你可以传递任何类型的参数,对于第二种情况,缺省参数的使用使得可以传递任意多个参数,因此函数的重载在python中就显得很鸡肋了,但如果非要实现函数重载,可以使用3.4中增加的转发机制即单分派泛型函数(single-dispatch generic function)来实现重载

11.2 单分派泛型函数

  • 泛型函数 generic function :由多个函数组成的函数,可以根据不同的参数类型决定调用那个函数
  • 单分派,single-dispatch:一种泛型函数分派形式,其中实现是根据单个参数的类型选择的。

所以,单分派泛型函数就是根据函数的第一个参数类型决定使用哪个函数的泛型函数

将一个函数声明为泛型函数可以使用修饰器@singledispatch,需要从functools模块导入,singledispatch有两个常用方法,register和dispatch

from functools import singledispatch@singledispatch
def Foo(arg,*args):print(arg)

这样就实现了一个泛型函数,他的分派发生在第一个参数类型上,如果想要基于此实现重载,需要使用他的register方法,

from functools import singledispatch@singledispatch
def Foo(arg,*args):print(arg)# 使用了类型注释
@Foo.register
def _1(arg:int,*args):print(f'int - {arg}')# 没有使用类型注释,显式传递给修饰器
@Foo.register(list)
def _2(arg,*args):print(f'list - {arg}')if __name__ == '__main__':Foo(3)  # int - 3Foo([i for i in range(10)])  # list - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

对于使用了类型注释的变量,singledispatch会自动推断第一个参数的类型,如上面int的那个,对于没有使用类型注释的变量,可以显式传递类型给singledispatch,如下面list的那个

register属性还可以以函数的形式调用,这可以用在lambdas表达式上,如

>>> def nothing(arg, verbose=False):
...     print("Nothing.")
...
>>> fun.register(type(None), nothing)

如果没有实现针对特定类型的注册,那么就会使用被@singledispatch修饰的函数

Foo("string")  # string

要检查泛型函数将为给定类型选择哪个实现,请使用dispatch()属性

print(Foo.dispatch(int))  # <function _1 at 0x000001D7C2724B70>
print(Foo.dispatch(list))  # <function _2 at 0x000001D7C2792E18>
print(Foo.dispatch(str))  # <function Foo at 0x000001FB456FC268>

要访问所有已注册的实现,请使用只读的registry属性

11.3 总结

python默认不支持重载,但可以使用单分派泛型函数实现,声明泛型函数需要使用修饰器@singledispatch,它有三个属性,register用来注册针对特定类型的“重载函数”,这里必须指明针对的是哪一个特定的类型,可以给第一个参数类型注释,也可以给register传入一个显式类型,否则会抛出TypeError异常;dispatch属性用来查看特定的类型将要选择的函数;registry用来访问所有已注册的实现。

参考链接:

functools.singledispatch

single dispatch

generic function

python中的重载

为什么 Python 不支持函数重载?其他函数大部分都支持的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL中的多表查询,以及JOIN的顺序重要么?

说法是&#xff0c;一般来说&#xff0c;JOIN的顺序不重要&#xff0c;除非你要自己定制driving table。 示例&#xff1a; SELECT a.account_id, c.fed_id, e.fname, e.lname-> FROM account AS a INNER JOIN customer AS c-> ON a.cust_id c.cust_id-> INNER JOIN …

python可变对象 不可变对象_【Python】可变对象和不可变对象

在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。id: 当一个对象被创建后&#xff0c;它的 id 就不会在改变&#xff0c;这里的 id 其实就是对象在内存中的地址&#xff0c;可以使用 id() 去查看对象在内存中地址。type: 和 id 一样当对象呗创建之后…

MySQL 调优基础(三) Linux文件系统

Linux的文件系统有点像MySQL的存储引擎&#xff0c;它支持各种各样的文件系统。它最上层是通过 virtual files system虚拟文件系统作为一个抽象接口层来对外提供调用的。然后下层的各种文件系统实现这些调用接口就行了。 1. Linux 中的 日志文件系统和非日志文件系统 文件内容的…

python 经典类和新式类

DAY 12. python新式类和旧式类 继承自object基类的类叫做新式类&#xff0c;否则叫做旧式类&#xff0c;python3中的类默认是新式类&#xff0c;之前版本默认是旧式类 rootkail:~# python python 2.7.15 (default,Jul 28 2018,11:29:29) [GCC 8.1.0] on linux2 Type "he…

Why does pthread_cond_signal not work?【转】

转自&#xff1a;http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote favorite I am currently learing all around POSIX threads (pthread). I now have created a simple program which increased a shared value by 7 until…

Android开发技术周报 Issue#72

新闻 Android N 最初预览版&#xff1a;开发者 API 和工具教程 Gradle依赖的统一管理 理解Java垃圾回收机制 浅谈 Android 编程思想和架构 由Android 65K方法数限制引发的思考 Android音频开发&#xff08;1&#xff09;&#xff1a;基础知识 Android音频开发&#xff08;…

python 单例模式的四种实现方法

DAY 13. 单例设计 13.1 什么是单例设计 一个类每次实例化返回的都是同一个对象&#xff0c;这种设计模式叫做单例设计&#xff0c;这个类叫做单例类 13.2 实现单例设计的方法 13.2.1 重写__new__() class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次实例化&…

Redis3.2.5部署(单节点)

1.安装jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字节跳动 设计模式 pdf_凭这份pdf我拿下了美团、字节跳动、阿里、小米等大厂的offer...

关于程序员&#xff0c;除了做项目来提高自身的技术之外&#xff0c;还有一种提升自己的专业技能就是&#xff1a;多&#xff01;看&#xff01;书&#xff01;小编整理出一篇Java进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n  m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

这道题要注意的是两个线程唤醒和等待的顺序&#xff0c;应为第一个线程会比第二个线程更早结束&#xff0c;所以如果第一个线程已经结束&#xff0c;而第二个线程还在等待被唤醒&#xff0c;那第二个线程会一直等待下去&#xff0c;因此第一个线程要先等待后唤醒&#xff0c;这…

项目开发容易出错情况统计

2016年11月17日 11:30:45 星期四 1.适配&#xff1a; a) APP弹窗大屏幕适配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按钮状态&#xff1a; a) 按钮点击后没有disable 如果新页面加载卡顿导致用户多次点击&#xff0c;生成多次请求 b) 按钮disable后什么时候enabl…

python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载&#xff0c;转载请联系出处。人生苦短&#xff0c;我该不该选择Python&#xff1f;编程语言几年一变样&#xff0c;榜单之争也是愈演愈烈&#xff0c;还架不住时不时杀出个黑马……而对于Python&#xff0c;自2010年初以来一直蓬…

android 音频播放总结 soundlPool,MediaPlay

soundlPool 用于小音频的播放多个同时播放。 使用步骤&#xff1a; 步骤一&#xff1a; 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下&#xff0c;区别在于assets下可以再新建文件夹而raw不行&#xff0c;assets内部单个文件超过1m时可能存在bug而raw不会…

文本分析软件_十大针对机器学习的文本注释工具与服务,你选哪个?

房地产和键【51CTO.com快译】目前&#xff0c;从搜索引擎与情感分析&#xff0c;到虚拟助手与聊天机器人&#xff0c;机器学习应用场景中的许多研究领域&#xff0c;都需要通过文本注释工具与服务来提供准确性。在AI研究与开发行业中&#xff0c;发现或创建可注释的数据对于项目…

sqlite创建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收机制

DAY 18. python垃圾回收机制 python GC主要有三种方式 引用计数标记清除分代回收 其中&#xff0c;以引用计数为主。 18.1 引用计数&#xff08;Reference Counting&#xff09; 《寻梦环游记》中说&#xff0c;人一生会经历两次死亡&#xff0c;一次是肉体死的时候&#…

曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家

荷重位移曲线仪广泛适用于各种按键及开关、DOME片、按键、微力弹片、硅胶按键、汽车开关之荷重-行程测定&#xff1b;Windows中英文双语软件&#xff0c;操作简单方便&#xff0c;软件流畅稳定&#xff0c;所有测试资料(测试条件&#xff0c;曲线&#xff0c;数据结果&#xff…

进程调度

1、策略 策略决定调度程序在何时让什么进程运行。调度器的策略往往决定系统的整体印象&#xff0c;并且&#xff0c;还要负责优化使用处理器时间。 1.1 I/o消耗型和处理器消耗型。 进程可以被分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或者等待I/O请…

Django,Ajax,Vue实现文章评论功能

Django评论 评论复杂的地方在于需要实现点击提交评论后评论内容需要立刻出现在下面&#xff0c;还要保持页面位置不变&#xff0c;所以提交后不能整体刷新页面&#xff0c;因为刷新以后页面肯定在最上面&#xff0c;而评论一般都在最下面&#xff0c;所以要用到Ajax 整个过程用…