在上一次的推送《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 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦
Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典