📜  Python中的抽象基类(abc)(1)

📅  最后修改于: 2023-12-03 15:04:36.337000             🧑  作者: Mango

Python中的抽象基类(ABC)

Python中的抽象基类(ABC)是用于表示接口的类。它们定义了一个或多个抽象方法,这些方法必须在子类中实现。比如Python中的collections模块就使用了抽象基类来定义数据结构的接口。

为什么需要抽象基类?

一个接口通常包括若干个方法,这些方法必须被实现才能让接口有用。在Python中,你可以定义一个空的基类或者使用NotImplementedError来实现一种接口。

class MyInterface:
    def foo(self):
        raise NotImplementedError()

    def bar(self):
        raise NotImplementedError()

这样的方式虽然可行,但是它有很多缺点。首先,没有办法检查一个类是否实现了这个接口;其次,实现的类不会被提醒去实现这些方法;最后,它也不能确保调用方正确地使用这些方法。

为了解决这些问题,Python引入了抽象基类。

如何使用抽象基类?

在Python中,你可以通过从abc.ABC类继承来创建一个抽象基类。抽象基类中必须包含至少一个抽象方法(没有具体实现的方法)。

from abc import ABC, abstractmethod

class MyInterface(ABC):
    @abstractmethod
    def foo(self):
        pass

    @abstractmethod
    def bar(self):
        pass

如果一个类继承了抽象基类但是没有实现其中的抽象方法,那么在实例化时会抛出TypeError异常。

class MyImplementation:
    def foo(self):
        print('foo')

MyImplementation()  # TypeError: Can't instantiate abstract class MyInterface with abstract methods bar

在实现类中,必须实现所有的抽象方法才能正常实例化。

class MyImplementation(MyInterface):
    def foo(self):
        print('foo')

    def bar(self):
        print('bar')

MyImplementation()  # 正常实例化
抽象基类的应用

抽象基类通常与多态结合使用,可以用于定义通用的算法或接口。

def process_data(data: MyInterface):
    data.foo()
    data.bar()

process_data(MyImplementation())  # foo bar

在这个例子中,process_data函数接受一个MyInterface类型的参数。由于MyImplementation类实现了MyInterface抽象基类中的所有方法,因此它可以被传递给这个函数作为参数。

总结

抽象基类是Python中定义接口的一种方式,可以用于确保实现类正确地实现了接口中定义的所有方法。抽象基类是多态的基础,可以用于创建通用的算法或接口。