python抽象类abc模块

概述

在java,抽象类是面向对象设计中很重要的东西

由于python是动态语言,有很强的灵活性,本身并不支持抽象类,需要借助abc模块

abc模块,Abstract Base Class,抽象基类,可以定义方法,但不实现

抽象类

定义抽象类

  1. 导入abc模块 import abc
  2. 需要给抽象类指定metaclass = abc.ABCMeta ,该类不能实例化

  3. 给抽象方法加上@abc.abstractmethod,子类必须实现该方法,否则实例化报错

import abc
#只能被继承,不能实例化,否则报错
class Animal(metaclass = abc.ABCMeta):  
    #子类必须实现该方法,否则实例化报错
    @abc.abstractmethod  
    def run(self):
        pass

    @abc.abstractmethod
    def eat(self):
        pass

实例化,如下:

a=Animal()

报错如下:

TypeError: Can't instantiate abstract class Animal with abstract methods eat, run

定义子类

子类有两种实现方式:

  1. 直接继承。简单,符合java风格
  2. 虚拟子类。灵活,符合python风格

直接继承

子类 必须实现 抽象类的 所有 抽象方法 ,子类才能被实例化

class People(Animal):
    def run(self):
        print("People is walking")

    def eat(self):
        print("people is eating")

class Pig(Animal):
    def run(self):
        print("Pig is running")

    def eat(self):
        print("people is eating")

实例化

peo1 = People()
pig1 = Pig()

peo1.run()
peo1.eat()
如果不全部实现就报错

该子类没有实例化eat()方法

class Dog(Animal):
    def run(self):
        print("Dog is zouing")
    #实例化Dog时报错
    #def eat(self):
    #    print("dog is eating")

实例化报错

d=Dog()

错误信息如下:

TypeError: Can't instantiate abstract class Dog with abstract methods eat

虚拟子类

将其他的类 注册 到抽象类下,当虚拟子类(调用register方法)

好处:

  1. 实现的第三方子类不需要继承抽象类
  2. 可以实现抽象基类中的 部分 抽象方法,也可以都不实现
  3. issubclass()进行判断返回True

实现子类:

class Dog:
    def run(self):
        print("Dog is running")

Animal.register(Dog)

测试:

d=Dog()
d.run()
print(issubclass(Dog,Animal))

感谢

https://www.cnblogs.com/anzhangjun/p/9780463.html
https://blog.csdn.net/qijiqiguai/article/details/77269839
https://blog.csdn.net/weixin_41624982/article/details/87650504


原文出处:/show_1EF4EtURBWQw.html