详解Python 函数如何重载?
作者:小小后端 发布时间:2021-04-11 04:48:30
什么是函数重载?简单的理解,支持多个同名函数的定义,只是参数的个数或者类型不同,在调用的时候,解释器会根据参数的个数或者类型,调用相应的函数。
重载这个特性在很多语言中都有实现,比如 C++、Java 等,而 Python 并不支持。这篇文章呢,通过一些小技巧,可以让 Python 支持类似的功能。
参数个数不同的情形
先看看这种情况下 C++ 是怎么实现重载的
#include <iostream>
using namespace std;
int func(int a)
{
cout << 'One parameter' << endl;
}
int func(int a, int b)
{
cout << 'Two parameters' << endl;
}
int func(int a, int b, int c)
{
cout << 'Three parameters' << endl;
}
如果 Python 按类似的方式定义函数的话,不会报错,只是后面的函数定义会覆盖前面的,达不到重载的效果。
>>> def func(a):
... print('One parameter')
...
>>> def func(a, b):
... print('Two parameters')
...
>>> def func(a, b, c):
... print('Three parameters')
...
>>> func(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
>>> func(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() missing 1 required positional argument: 'c'
>>> func(1, 2, 3)
Three parameters
但是我们知道,Python 函数的形参十分灵活,我们可以只定义一个函数来实现相同的功能,就像这样
>>> def func(*args):
... if len(args) == 1:
... print('One parameter')
... elif len(args) == 2:
... print('Two parameters')
... elif len(args) == 3:
... print('Three parameters')
... else:
... print('Error')
...
>>> func(1)
One parameter
>>> func(1, 2)
Two parameters
>>> func(1, 2, 3)
Three parameters
>>> func(1, 2, 3, 4)
Error
参数类型不同的情形
同样,先看下当前情况下 C++ 的重载是怎么实现的
#include <iostream>
using namespace std;
int func(int a)
{
cout << 'Int: ' << a << endl;
}
int func(float a)
{
cout << 'Float: ' << a << endl;
}
代码中,func 支持两种类型的参数:整形和浮点型。调用时,解释器会根据参数类型去寻找合适的函数。Python 要实现类似的功能,需要借助 functools.singledispatch 装饰器。
from functools import singledispatch
@singledispatch
def func(a):
print(f'Other: {a}')
@func.register(int)
def _(a):
print(f'Int: {a}')
@func.register(float)
def _(a):
print(f'Float: {a}')
if __name__ == '__main__':
func('zzz')
func(1)
func(1.2)
func 函数被 functools.singledispatch 装饰后,又根据不同的参数类型绑定了另外两个函数。当参数类型为整形或者浮点型时,调用绑定的对应的某个函数,否则,调用自身。
执行结果
Other: zzz
Int: 1
Float: 1.2
需要注意的是,这种方式只能够根据第一个参数的类型去确定最后调用的函数。
关于 singledispatch 的更多细节请看官方文档
https://docs.python.org/3.6/library/functools.html#functools.singledispatch
注意:函数返回值不同也是重载的一种情况,暂时没有比较好的 Python 实现方式,所以没有提及
个人觉得,重载就是为了语言的灵活性而设计的,而 Python 函数本来就有不少巧妙的设计,这个时候去仿这个技术,其实没有多大必要,而且感觉有些违背 Python 的哲学。所以,本文更多的是在讲如何模仿,而对于重载的使用场景并没有作多少说明。
以上所述是小编给大家介绍的Python函数重载详解整合网站的支持!
来源:https://juejin.im/post/5cbcf38bf265da03af27d327
猜你喜欢
- 问题:python2.7 查询或者插入中文数据在mysql中的时候出现中文乱码---可能情况:1.mysql数据库各项没有设置编码,默认为&
- 在Windows平台下,如果想运行爬虫的话,就需要在cmd中输入:scrapy crawl spider_name这时,爬虫就能启动,并在控
- 一、停止数据库服务打开sqlserver自带的配置管理器,停止数据库服务。二、打开cmd窗口,执行命令(以管理员运行)以单用户模式启动sql
- 创建main.py文件并粘贴下面代码点击右键运行Debug 'main'后,下方的Debug窗口会出现ImportError
- 一、触发器1.触发器在数据库里以独立的对象存储,2.触发器不需要调用,它由一个事件来触发运行3.触发器不能接收参数--触发器的应用举个例子:
- Checkbutton(多选按钮)组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像,你可以将一个 Python
- 本节主要讲的是if条件不满足时,也可以给提示,就是走else必须先做类型转换另一种写法if-else语句else后的冒号,必须是英文的&am
- 如果只是想实现将jenkins的构建结果发送到企业微信进行通知,最简便的方式是安装Qy Wechat Notification Plugin
- 你甚至可以在一行内将多个值赋值给多个变量>>> a , b = 45, 54>>> a45>>
- 本文实例讲述了Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能。分享给大家供大家参考,具体如下:/*** 利用php
- 当浏览者进入你的网站首页时或提交某些表单时,会弹出网站声明或提交说明等文本信息框,引导浏览者使用你的网站。实现这个功能我们是用Dreamwe
- 平常需要怎么做来维护数据库吗?1. 允许收缩数据库中的每个文件以删除未使用的页。数据和事务日志文件都可以收缩。数据库文件可以作为组或单独地进
- 还记得以前在工作中,将爬来的其它网站的数据导到xml。但是会遇到一个问题:即网页会有ascII的控制字符。一开始以为是别人为了防止采集而加入
- 给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除主要涉及的知识点有:os模块综合应用glob模块综合应用利用f
- 本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法。分享给大家供大家参考,具体如下:基本思想:冒泡排序是一种交换排序,
- 本文实例讲述了Python实现的递归神经网络。分享给大家供大家参考,具体如下:# Recurrent Neural Networksimpo
- 有时候我们需要判断两个字符串内容是否相等,判断内容相等,我们用‘==',但是有时候发现print(str1)和print(str2)
- 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语
- 前言:Redhat下安装Python2.7rhel6.4自带的是2.6, 发现有的机器是python2.4。 到python网站下载源代码,
- 昨天我的电影网站在生成内容静态页面的时候出了问题,提示下标越界,以前从来没有遇到过的,所以根本不知道是什么东西,于是就到处在网上找答案,但是