Chapter11-抽象类ABC类Python不提供抽象类和抽象方法,而是提供了一个内置的模块abc(抽象基类)来模拟抽象类的实现。可以通过abc将基类声明为抽象类,然后将具体类注册为这个基类的实现。假设我们正在编写有关动物的代码。涉及的动物有鸟、狗和牛。首先,鸟、狗、牛都是动物。既然是动物,就必须要吃东西,要发出声音。但是对于鸟、狗、牛来说,吃的和叫的肯定是不一样的。您需要为鸟类、狗、牛的食物和声音实施特定代码。总结抽象基类的作用:定义一些通用的事物规则和行为示例:):print('哇....')classBird(Animal):defvoice(self):print('jiji....')classCow(Animal):defvoice(self):print('哦.....')if__name__=="__main__":d=Dog()d.voice()d.eat()#raiseNotImplementedError这个实现有个缺点,就是只有在子类调用eat方法的时候会不会报错。子类可以正常实例化。但是你能想象鸟、狗、牛不能吃吗?如果不能吃,那肯定不是动物。所以正常的实现应该是如果没有实现eat方法,实例化应该失败。然后这里是使用抽象基类的一般方法。importabcclassAnimal(object):__metaclass__=abc.ABCMeta@abc.abstractmethoddefeat(self):return@abc.abstractmethoddefvoice(self):returnclassDog(Animal):defvoice(self):print('wow....')defeat(self):print("Dogeat...")classBird(Animal):defvoice(self):print('jiji....')defeat(self):print("Birdeat...")classCow(Animal):defvoice(self):print('Oh.....')defeat(self):print("Coweat...")if__name__=="__main__":d=Dog()b=Bird()c=Cow()d.声音()D。吃()b。voice()b.eat()c.voice()c.eat()返回结果:wow....Dogeat...jiji....Birdeat...Oh.....Coweat...使用注册方法:fromabcimportABCMeta,abstractmethodclassAnimal(metaclass=ABCMeta):@abstractmethoddefeat(self):return@abstractmethoddefvoice(self):returnclassDog(object):defvoice(self):print('哇...')defeat(self):print("Dogeat...")#要使用注册方法,两个方法都要写,否则会报错Animal.register(Dog)if__name__=="__main__":d=Dog()d.voice()d.eat()继承和注册有什么区别?animals.pyfromabcimportABCMeta,abstractmethodclassAnimal(metaclass=ABCMeta):@abstractmethoddefeat(self):return@abstractmethoddefvoice(self):returnssub_class.pyfromanimalsimportAnimalclassDog(Animal):defvoice(self):打印('哇....')defeat(self):print("Dogeat...")print('subclass=',issubclass(Dog,Animal))print('Instance=',isinstance(Dog(),Animal))abc_register.pyfromanimalsimportAnimalclassDog(object):defvoice(self):print('wow....')defeat(self):print("Dogeat...")Animal.register(Dog)print('subclass=',issubclass(Dog,Animal))print('Instance=',isinstance(Dog(),Animal))
