Python 重载与重写 及 泛型函数

在上一次的推送《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实用宝典

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注