鸭子类型

定义

  • 在维基百科中的准确定义是‘是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由”当前方法和属性的集合”决定’
  • 个人理解:实现了指定的方法就可以拿来当特定的类型用 , 比如getitem就可以当做collection用 , 来切片索引与静态类型来对比(比如java):多态,你可以用父类的引用而传入子类的对象,而鸭子类型不用继承,更为灵活。(:多态最核心的思想就是,父类的引用可以指向子类的对象,或者接口类型的引用可以指向实现该接口的类的实例。多态之所以是这样的是因为基于一个事实:子类就是父类!)鸭子类型是一种不严格的类型,弱类型有相同方法的类型,可以归为一类鸭子
class Duck():
    def walk(self):
        print("i'm walking!")
class People():
    def walk(self):
        print("i'm walking!")
def test(animal): #  核心就是这里并不检查animal类型,所以只要实现了walk方法的都行
    animal.walk()
duck = Duck()
people = People()
test(duck)
test(people)
i'm walking!
i'm walking!

对于一个鸭子类型来说,我们并不关心这个对象的类型本身或是这个类继承,而是这个类是如何被使用的。

python协议

定义

protocol可以看作是通知型的接口,它规定了调用方使用该功能要调用对象的哪些方法
比如要做切片等操作,实现getitem()就行,根据协议,进行切片的时候就会去使用该方法

参考

  1. Python的鸭子类型
  2. Python - 协议和鸭子类型

路漫漫其修远兮,吾将上下而求索