python中的约束(抽象类、抽象方法)

其他语言中大部分都有接口,在python中是没有接口一说的,那么在python中,要怎么实现约束呢,方法有如下两种。

简单来讲,所谓接口就是若干抽象方法的集合,作用主要是限制实现接口的类必须按照借口给定的调用方式实现这些方法,对高层模块隐藏了类的内部实现。

方法一(不实现就是用直接抛异常):
1
2
3
4
5
6
7
8
9
10
class Base:
def send(self):
raise NotImplementedError('send()方法必须在子类中重新定义')

class Son(Base):
def run(self):
print('开始运行')

obj = Son()
obj.send()

异常如下:

NotImplementedError: send()方法必须在子类中重新定义

缺点:

  • 子类实例化对象如果不调用未实现的方法不会报错,调用时才会报错
方法二(抽象类,抽象方法):
1
2
3
4
5
6
7
8
9
10
11
12
13
from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
def func1(self):
pass
@abstractmethod
def send(self):
raise NotImplementedError('send()方法必须在子类中重新定义')

class Son(Base):
def run(self):
print('开始运行')

obj = Son()

异常如下:

TypeError: Can't instantiate abstract class Son with abstract methods send

python中没有独立的接口关键字,是通过特殊类的方式实现的接口约束,所以可以继承多个抽象类