📅  最后修改于: 2023-12-03 15:04:36.337000             🧑  作者: Mango
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中定义接口的一种方式,可以用于确保实现类正确地实现了接口中定义的所有方法。抽象基类是多态的基础,可以用于创建通用的算法或接口。