python 重载_Python 重载与重写及泛型函数

2f6fb750295c4f3d5a8ede0d9181d4ad.png

在上一次的推送《Python 监控文件事件变化—以音乐高潮提取为例》中,最后继承 LoggingEventHandler 类,对 on_created 进行修改的时候,我使用了一个词叫:重载,随后不久我便意识到犯下了一个错误。

我们先来看看重载与重写的概念:

重载:

重载的条件如下:

1.一个类里面

2.方法名字相同

3.参数不同

而参数不同可分为:参数类型不同,参数个数不同。而上一次推送中,对on_created的修改并没有针对参数,我们只是单纯地对函数内容进行修改而已。因此只能叫重写

重写:

条件如下:

1.参数列表与原函数一致。

2.返回类型与原函数一致。

因此,根据这个条件,Python中绝大部分的继承修改只能叫重写,而不能叫重载

Python其实不需要重载这个概念。为什么呢?重载主要是针对参数而言的,一个是改变参数的类型,一个是改变参数的个数。而Python不需要限定参数类型,又 可以接受可变参数,因此函数重载就显得非常鸡肋了。

不过我们依然能通过singledispatch装饰器来实现重载,不过官方称其为泛型函数:

在需要被重载的函数上加上装饰器:

from functools import singledispatch
 
 
@singledispatch
def fun(arg, verbose=False):
 if verbose:
   print("Let me just say,", end=" ")
 print(arg) 

然后用register属性注册重载后的函数:

@fun.register(int)
def _(arg: int, verbose=False):
 if verbose:
   print("Strength in numbers, eh?", end=" ")
 print(arg)
 
 
@fun.register(list)
def _(arg: list, verbose=False):
 if verbose:
   print("Enumerate this:")
 for i, elem in enumerate(arg):
   print(i, elem) 

效果如下:

>>> fun(42, verbose=True)
Strength in numbers, eh? 42
 
>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam 

看,这样我们就顺利完成了重载,尽管其实大部分时候都不会用到。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦

fe77122ac179671c6a4d5ee1581f9e82.png

有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

http://weixin.qq.com/r/MDiJkcHEsZzOrYXy920i (二维码自动识别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值