python抽象类
在面向对象编程术语中,一个类如果无法被实例化,即不能创建该类的对象,则称其为抽象类。然而,你可以将其用作构建其他类的基类或父类。
创建一个抽象类
在Python中创建一个抽象类,它必须继承abc
模块中定义的ABC
类、或者指明metaclass=ABCMeta
,两种方式本质上是一样的,因为ABC
类是一个使用ABCMeta
作为其元类的辅助类。因此,下面两种写法是等效的:
from abc import ABC
class MyABC(ABC):
pass
from abc import ABCMeta
class MyABC(metaclass=ABCMeta):
pass
abc
这个模块可以在Python的标准库中找到。
Python的抽象类中虽然不强制要求必须有抽象方法,但通常会在抽象类中包含抽象方法,以更好地发挥抽象类的作用和优势。
一个抽象方法就是不能被调用但是可以被重写的方法。你需要用@abstractmethod
装饰器来装饰它。
示例
下面定义了一个抽象类,并试图实例化该抽象类:
from abc import ABC, abstractmethod
class MyAbstractClass(ABC):
# 抽象方法
@abstractmethod
def method1(self):
print('抽象方法')
# 非抽象方法
def method2(self):
print('非抽象方法')
obj = MyAbstractClass()
MyAbstractClass
类继承了ABC
类。其中有一个方法method1()
,它是抽象方法。注意,这个类可以有其他非抽象的(具体的)方法,例如method2()
方法就是具体方法。
如果尝试实例化一个MyAbstractClass
类的对象,Python会引发TypeError
:
下面,我们定义一个子类MyConcreteClass
,继承抽象类MyAbstractClass
,子类必须重写父类中的抽象方法。如果不这样做,Python 会抛出错误。
from abc import ABC, abstractmethod
class MyAbstractClass(ABC):
# 抽象方法
@abstractmethod
def method1(self):
print('抽象方法')
# 非抽象方法
def method2(self):
print('抽象类中的非抽象方法')
class MyConcreteClass(MyAbstractClass):
# 重写抽象父类的抽象方法
def method1(self):
print('具体类中实现了抽象类的抽象方法')
obj = MyConcreteClass()
obj.method1()
obj.method2()
运行输出:
具体类中实现了抽象类的抽象方法
抽象类中的非抽象方法