#设计模式 :—— 接口
#接口类 : python原生不支持 默认多继承,接口类中的所有方法都必须不能实现(父类中)!!!
#抽象类 : python原生支持的 不支持多继承、抽象类中可以实现一些方法
from abc import abstractmethod, ABCMeta
abc模块中的metaclass = ABCMeta和 @ abstractmethod
规范 : 接口类或者抽象类都可以
本质是做代码规范用的:希望在子类中实现和父类方法名字完全一样的方法
区别:在java的角度上看有区别
java本来就支持单继承,所以有了抽象类,为了规范子类
java没有多继承,所以为了接口原则,就设计接口这个概念,就支持多继承了
python当中支持多继承和单继承、所以对于接口类和抽象类就不那么明显了
python原生不支持接口类,
#多态和鸭子类型:
python天生支持多态
#封装:
__名字 就把这个名字或者方法私有化了
私有化以后不能从外部直接借用
静态属性和方法 对象属性 都可以私有化
这种私有化只是从代码级别做了变性,并没有真的约束
_类名__名字 (在类外部用次方法调用)、在类的内部直接 __名字 调用
接口类单继承
# -*- coding:utf-8 -*-
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # 元类 默认的元类 type #定义父类(接口类)
@abstractmethod #定义抽象方法,无需实现功能
def pay(self,money):pass #没有实现这个方法
class Wechat(Payment):
def pay(self,money):
print('已经用微信支付了%s元'%money)
class Alipay(Payment):
def pay(self,money):
print('已经用支付宝支付了%s元' % money)
class Applepay(Payment):
def pay(self,money): #没有使用规范的pay、就会报错
print('已经用applepay支付了%s元' % money)
def pay(pay_obj,money): #统一支付入口(接口类)**************
pay_obj.pay(money)
wechat = Wechat()
ali = Alipay()
app = Applepay() #只定义(只要没使用pay方法就会报错)
# wechat.pay(100) #不使用接口类,传统调用方法
# ali.pay(200) #不使用接口类,传统调用方法
pay(wechat,200) #统一支付入口调用支付方法
E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/day25接口类抽象类/1接口类.py
已经用微信支付了200元
接口类多继承
tiger 走路 游泳
swan 走路 游泳 飞
oldying 走路 飞
规范: 如果引用、必须按照Swim_Animal Walk_Animal Fly_Animal的规范来写代码
实现不同的功能,去继承不同的接口类,来规范当前类里面有哪些函数
接口隔离原则:
使用多个专门的结构,而不使用单一的总接口,即客户端不应该依赖那些不需要的接口
接口类 :刚好满足接口隔离原则、面向对象开发的思想、规范
# -*- coding:utf-8 -*-
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
#上面规范不需要些代码、只起到规范作用
class Tiger(Walk_Animal,Swim_Animal):
def walk(self): #接口类规范、继承Walk_Animal,Swim_Animal、必须按照父类的规范来写、如果此处名字不为walk就报错
print('老虎走路')
def swim(self): #继承了Swim_Animal、不使用Swim_Animal里的名字就会报错(规范)
print('老虎游泳')
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass
tiger = Tiger()
tiger.walk()
tiger.swim()
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/day25接口类抽象类/2.接口类的多继承.py
老虎走路
老虎游泳