鸭子类型和白鹅类型以及python的虚拟子类注册器

鸭子类型基本定义

python是一种多态语言,崇尚鸭子类型。

鸭子类型: 鸭子类型没有明确的接口,只是遵循了一定的协议,比如python序列协议只需要实现lengetitem方法 对于序列,这点鸭子类型和白鹅类型中Sequence抽象基类的要求完全相同,只是白鹅类型Sequence继承后能够自动获得抽象基类的方法,而鸭子类型没有这些方法.

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

python 白鹅类型和鸭子类型 白鹅类型: 白鹅类型对接口有明确定义,比如不可变序列(Sequence),需要实现containsiterlengetitemreversed,index,count 对于其中的抽象方法,子类在继承时必须具体化,其余非抽象方法在继承时可以自动获得,Sequence序列必须具体化的抽象方法是lengetitem

实际上这些语言特性Golang也比较推崇

虚拟子类

如果不继承抽象基类,也可以通过abc.xxx.register声明方式,自己实现一个包含实现方法的类,这种类叫虚拟子类,虚拟子类不强制实现父类的所有方法,也就是无论编译时还是运行时,除非我调用这个方法你不存在才会报错,类前面加上@abc.xxx.register注解。py3.3之前register只是一个函数,所以只能函数调用类写到()里

 

原文地址:https://www.cnblogs.com/handso/p/14074016.html