接口
-
接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码
-
接口本质就是一套协议标准,遵循这个标准的对象就能被调用
-
接口的目的就是为了提高扩展性
# 关于支付的接口
class Payment:
def pay(self, money):
raise NotImplemented
# 当Payment的子类使用了Payment类中pay方法就主动抛出异常,
# 当子类中有pay方法,也就是覆盖了Payment中的pay方法,后就不会抛出异常
# 这样达到了规范接口的目的
class Wechat(Payment):
def pay(self, money):
print('使用微信支付了%s'%money)
class Ali(Payment):
def pay(self, money):
print('使用阿里支付了%s'%money)
class Apple(Payment):
def zhifu(self, money):
print('使用苹果支付了%s' % money)
# 统一支付入口
def pay(pay_obj, money):
pay_obj.pay(money)
pay(Wechat(),100) # 使用微信支付了100
pay(Ali(), 100) # 使用阿里支付了100
pay(Apple(), 100) # 报错, 因为Apple里没有pay方法
接口主要是方便了对象的使用者,降低使用者的学习难度,只要学习一套使用方法,就可以以不变应万变
如果子类没有按照你的协议来设计,也没有办法限制他,将导致代码无法运行.
abc模块
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 将Payment设定为一个规范的类,就使得凡是继承了Payment的类都要有一个pay方法,若没有则报错
class Apple(Payment):
def zhifu(self, money):
print('使用苹果支付了%s' % money)
# 有了pay方法,实例化Apple就不会报错
# def pay(self, money):
# pass
apple = Apple() # 报错: TypeError: Can't instantiate abstract class Apple with abstract methods pay
接口类
接口类:支持多继承,接口类中的方法都必须不能实现
抽象类:不支持多继承,抽象类中的方法可以有一些代码的实现
接口类的多继承
# Tiger 走 游
# swan 走 游 飞
# eagle 走 飞
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):
pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self0):
pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):
pass
class Tiger(Walk_Animal, Swim_Animal):
def walk(self0):
pass
def swim(self):
pass
class Swan(Swim_Animal, Walk_Animal, Fly_Animal):
def swim(self):
pass
def walk(self0):
pass
def fly(self):
pass
class Eagle(Walk_Animal, Fly_Animal):
def walk(self0):
pass
def fly(self):
pass