Python泛型思考

近日在学习Python内容时学习到了泛型,但从个人看法来说Python泛型与Java的泛型有很大的不同,在此提出一点个人的看法

首先,针对Java的泛型,其主要作用是作为某些以后才指定类型的替代,在编写过程中这些泛型可以在实例化过程中由参数指定,典型例子如集合类当中的泛型

List list = new ArrayList()

这就相当于指定了该集合类的新类型。泛型使用的原因是可以加强类型转化的安全性以及减少转换的次数。比如在上例中的List集合中,如果从中取出一个元素,在未指明泛型的前提下,取出的类型元素只能是Object,必须使用强制类型转换转化为对应的类型才能供后续代码使用。那么,此处就可能存在问题,因为没有指明泛型,那么意味着加入集合的时候只要你的元素类型是Object即可加入,由于在Java中Object为最高基类,意味着任何元素都可加入泛型当中,由此,没有任何办法保证你取出的元素一定是你想要的的类型,所以此时为保证程序健壮性必须处理ClassCastException异常;但在指明泛型后,由于出入都可以限制元素类型,所以减少了此种转换的异常,也就保证了转换的安全性。

由以上描述可以知道,泛型首先要求的是你能够在实例化时指定类型,所以泛型一般应用于强类型的语言当中才比较好用,但Python本身是弱类型语言,所以Python的泛型并不完全是这种作用

Python的泛型类Generic的注释中提到,A generic type is typically declared by inheriting from an instantiation of this class with one or more type variables. 也就是说,Python 的泛型类型是继承这个类之后才会声明,这种声明方式与Python的抽象类声明方式十分类似。以IO下的三个实现类为例,其声明分别为

class IO(Generic[AnyStr]):
class BinaryIO(IO[bytes]):
class TextIO(IO[str]):

从这些定义中可以看出,在声明泛型类之后IO类便可以使用泛型的方式去作为其他类的基类定义,

并且AnyStr在Python的类型声明中是包含了bytes与str两类的,由此我们可以发现Python的泛型与Java泛型的一个最根本区别:Python 的泛型是在声明时就指定了泛型类型,也就是说,Python的泛型类型主要作用是:某个类存在多种使用场景,并且我们可以预知各个使用场景的类型,为了将原始代码能够广泛应用于其他场景上使用泛型去保障代码在各个场景上的通用性。因此,在泛型类的声明中并不像其他语言一样使用类似T的方式去替代类型,而是直接使用已经声明的泛型类型在代码中书写,如readline函数的定义

    @abstractmethod
    def readline(self, limit: int = -1) -> AnyStr:
        pass

由此,我们可以归纳Python泛型的两个条件:

1.继承Generic类,并在类的参数中指明泛型类型

2.在实现中使用泛型类型参与代码编写

最后,由于在声明时就已经指定了泛型的类型,所以Python泛型更大程序上我认为是一个具有辅助说明的功能,相当于说明在编写当中告诉编程人员应当使用什么类型,这其实从另一个层面上也是在其他语言中泛型功能的一大体现

你可能感兴趣的:(Python学习笔记,python)