首页 > 技术文章 > python--面向对象—接口

gaoshengyue 2017-09-19 16:33 原文

开放封闭原则
依赖导致原则
接口隔离原则
继承多态
抽象类和接口类
    编程思想:为子类做规范
 归一化设计:几个类都实现了相同的方法
 抽象类:最好单继承,且可以简单的实现功能
 接口类:可以多继承,且最好不实现具体功能
 实现接口类和抽象类的语法

 from abc import abstractclassmethod,ABCMeta
 class Xx(metaclass=ABCMeta):
   @abstractclassmethod
   def Yy():pass

钻石继承问题

    python的新式类,和经典类在继承顺序上的不同
 新式类:广度优先
    查看继承顺序  子类名.mro()
 经典类:深度优先
新式类和经典类的区别:定义阶段,经典类有object新式类不用,子类执行父类中的同名方法上,继承问题
多态
    python天生支持多态 

接口类

 

class Applepay:
     def payment(self,money):
  print('苹果 支付了%d元'%money)
class Alipay:
     def payment(self,money):
  print('支付宝 支付了%d元'%money)
def payment(pay_obj,money):
 pay_obj.payment(money)
apple=Applepay()
ali=Alipay()
payment(apple,100)
payment(ali,100)

归一化设计

from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): #抽象类/接口类
      @abstractmethod            #给接口类加装饰器
   def payment(self,money):pass
class Applepay(Payment):
     def payment(self,money):
     print('苹果 支付了%d元'%money)
  def payment(pay_obj,money):
     pay_obj.payment(money)
class Alipay(Payment):
     def payment(self,money):
      print('支付宝 支付了%d元'%money)
  def payment(pay_obj,money):
     pay_obj.payment(money)
class We(Payment):
     def fuqian(self,money)
  print('微信支付了%d元'%money)
apple=Applepay()
ali=Alipay()
we=We()
payment(apple,100)
payment(ali,100)
payment(we,100)

这样的话,如果子类里面没有要用的方法的话,在实例化对象的时候就会报错
如果有这个方法的话,实例化和使用的时候都不会报错。
主要是用来限制和规定某一类必须要用到某个方法
归一化设计:
1.接口类 不实现具体的方法,并且可以多继承
2.实现具体内容,做一些基础实现,并且不推荐多继承

多继承

 

from abc import abstractclassmethod,ABCMeta
class Fly_Animal(metaclass=ABCMeta):
    @abstractclassmethod                   #限制必须用fly方法
    def fly(self):
        print('')
class Walk_Animal:
    def walk(self):
        print('')
class Swim_Animal:
    def swim(self):
        print('游泳')
class Tiger(Walk_Animal):
       def si(self):
           pass
class Tiane(Walk_Animal,Swim_Animal,Fly_Animal):   #多继承
    def fly(self):
        super().fly()
class Qingwa(Walk_Animal,Swim_Animal):
    def fd(self):
        pass
tiane=Tiane()
tiane.fly()

多继承限制

class D:
    def test(self):
        print('D')
class B(D):                    #B要是没有找D
    def test(self):
        print('B')
class C(D):
    def test(self):
        print('C')
class A(B,C):
    pass
    # def test(self):          #如果没有就去找B,B和D都没有再C
    #     print('A')
a=A()
a.test()

深度优先↑  新式类广度优先
所有类继承的基类object新式类 python3中不用强制继承
.mro()看顺序

 

推荐阅读