Python抽象基类和接口类的继承

2023-04-02 00:00:00 抽象 接口 继承

Python中的抽象基类(Abstract Base Classes,简称ABC)和接口类(Interface Classes)都是用来规范类的行为的。它们定义了类应该实现的方法和属性,但是不提供具体的实现,需要子类来具体实现。

下面分别介绍抽象基类和接口类的继承。

抽象基类的继承
抽象基类是通过abc模块来定义的,它是一个特殊的类,不能直接实例化。子类必须实现抽象基类中定义的抽象方法,否则会抛出TypeError异常。

子类继承抽象基类时,可以使用@abstractmethod装饰器来声明一个抽象方法,也可以不用装饰器,直接在子类中实现。

示例代码如下:

import abc

class BaseClass(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def method1(self):
        pass

class SubClass(BaseClass):
    def method1(self):
        print("SubClass method1 implementation")

上面的代码中,BaseClass是一个抽象基类,其中定义了一个抽象方法method1。SubClass继承了BaseClass,并实现了method1方法。

在子类中必须实现抽象方法,否则会报错,示例代码如下:

class SubClass(BaseClass):
    pass

# 报错:TypeError: Can't instantiate abstract class SubClass with abstract methods method1

接口类的继承
接口类是一个纯粹的抽象类,没有任何属性和方法的实现,它只定义了一个接口。子类必须实现接口中的所有方法,否则会抛出NotImplementedError异常。

Python中并没有提供官方的接口类,但是我们可以通过抽象基类来模拟接口类的行为。

示例代码如下:

class InterfaceClass(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def method1(self):
        pass

    @abc.abstractmethod
    def method2(self):
        pass

class SubClass(InterfaceClass):
    def method1(self):
        print("SubClass method1 implementation")

    def method2(self):
        print("SubClass method2 implementation")

上面的代码中,InterfaceClass是一个接口类,其中定义了两个抽象方法method1和method2。SubClass继承了InterfaceClass,并实现了method1和method2方法。

在子类中必须实现所有接口方法,否则会报错,示例代码如下:

class SubClass(InterfaceClass):
    def method1(self):
        print("SubClass method1 implementation")

报错信息为:

TypeError: Can't instantiate abstract class SubClass with abstract methods method2

相关文章