作用:可以限制子类必须实现类中定义的抽象方法(@abc.abstractmethod)
import abc # abc是 abstract class(抽象类) 的缩写,不是随便写的 class AClass(metaclass=abc.ABCMeta): # 抽象类 @abc.abstractmethod # 装饰抽象方法 def run(self): pass @abc.abstractmethod # 装饰抽象方法 def run2(self): pass class B(AClass): pass # b = B() # 直接报错,TypeError: Can't instantiate abstract class B with abstract methods run class C(AClass): def run(self): print("runrunrun....") # c = C() # 少实现了一个方法,直接报错 TypeError: Can't instantiate abstract class C with abstract methods run2 class D(AClass): def run(self): print("runrunrun....") def run2(self): print("runrunrun2....") d = D() # 把抽象类的方法都实现了,不会报错 鸭子类型由来:python 一般不会限制你必须怎么写,作为一个优秀的程序员,就应该自觉遵守相关协议,所以就有了鸭子类型这一说
如果这个对象长得像鸭子(属性),走路像鸭子(方法),那么他就是鸭子(没有说必须方方面面都像)
鸭子类型:拥有相同属性和方法,那么就可以把它看成同样的类,也可以提高扩展性
代码案例(去掉接口,自觉遵守,不改pc代码)
接口与抽象类小结: ''' 接口是一套协议规范,明确子类们应该具备哪些功能 抽象类是用于强制要求子类必须按照协议中的规定来(接口中定义的)实现 然而python 不推崇限制你的语法,我们可以设计成鸭子类型,既让多个不同类对象具备相同的属性和方法,对于使用者而言,就可以以不变应万变,轻松地使用各种符合协议的对象 '''