从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件
  • 首页
  • Python
  • 45、面向对象 接口类 抽象类 多态 封装

45、面向对象 接口类 抽象类 多态 封装

发布:蔺要红06-25分类: Python


#设计模式 :—— 接口
#接口类 : 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
老虎走路
老虎游泳


 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站