关于python支持泛型的讨论

2021年1月4日 / 8次阅读 / Last Modified 2021年1月4日

其实python这样超级灵活的动态语言,是不需要专门支持泛型函数编程的。动态语言本就无所谓类型,一切指向都是 object reference。我们完全可以很简单的通过对函数入参对象类型的判断,来实现泛型。比如下面这样的代码:

>>> def say_hello(x):
        if isinstance(x, int):
            print('你好,整数')
        elif isinstance(x, str):
            print('你好,字符串')
        else:
            print('抱歉,我不认识你')

>>> say_hello(5)
你好,整数
>>> say_hello('abc')
你好,字符串
>>> say_hello([1,2,3])
抱歉,我不认识你

如果say_hello有多个参数,如法炮制,就是泛型函数。

关于python支持泛型编程的问题,网上有很多争论。有人喜欢,也有人说没必要。我们除了可以按照上述代码的模式自己写泛函数之外,还可以通过python的鸭子类型。

动态语言中有鸭子类型,如果走起来像鸭子,叫起来也像鸭子,那么它就是鸭子。一个对象的特征,不由它的类型决定,而是由它有哪些属性来决定,即它有哪些成员属性和成员函数。因此函数重载在动态语言中就显得不是那么必要,函数完全可以通过鸭子类型来处理不同的对象,鸭子类型也是多态的一种表现。

比如下面的代码:

>>> def write(out, content):
...     out.write(content)

只要out对象有write方法,管它是什么类型,统统可以传入write函数进行操作。这就是鸭子类型,这就是动态类型语言的泛型。

不过,python从3.4开始,还是提供了一个装饰器 @singledispatch,来支持单泛函数,即只对函数第1个参数实现泛型化,这就是下一篇的内容了。

说点题外话,我个人现在有这样的理解:像python这样的内容丰富的语言,我们学习完它的核心之后,其它的东西可以慢慢在使用中学习,有些东西不会也不会影响到什么,不会影响我们继续前行,本质上python是一个工具,我们应该更关注我们要解决的问题。成为python专家很有吸引力,如果那是你的目的。就是Linux,大家都在使用,每个人的水平参差不齐,但如果你的目标不是专门研究Linux的话,够用就好了。

-- EOF --

本文链接:https://www.pynote.net/archives/3069

相关文章

    留言区

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


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top