广度优先和深度优先 父类对子类的约束 多态 鸭子模型

类的继承顺序

  1. 只要继承object的就是新式类,不继承object就是经典类(只存在于python2X)

  2. 经典类与新式类的多继承

    1. 在经典类中都是深度优先,在一条路走不通止呕再换一条路,走过的点不会重复

       

    2. 新式类中遵循广度优先:C3算法,print(类名.mro())来查看

  3. 父类对子类的约束

    1. 之前使用的都是普通的类

    2. 抽象类:是一个开发的规范,约束它的所有子类必须实现一些和它同名的方法

       1  # class Payment:     # 抽象类
       2  #     def pay(self,money):
       3  #         '''只要你见到了项目中有这种类,你要知道你的子类中必须实现和pay同名的方法'''
       4  #         raise NotImplementedError('请在子类中重写同名pay方法')     方法一:主动抛异常
       5  #
       6  # class Alipay(Payment):
       7  #     def __init__(self,name):
       8  #         self.name = name
       9  #     def pay(self,money):
      10  #         dic = {'uname':self.name,'price':money}
      11  #         # 想办法调用支付宝支付 url连接 把dic传过去
      12  #         print('%s通过支付宝支付%s钱成功'%(self.name,money))
      13  #
      14  # class WeChat(Payment):
      15  #     def __init__(self,name):
      16  #         self.name = name
      17  #     def pay(self,money):
      18  #         dic = {'username':self.name,'money':money}
      19  #         # 想办法调用微信支付 url连接 把dic传过去
      20  #         print('%s通过微信支付%s钱成功'%(self.name,money))
      21  #
      22  # class Apple(Payment):
      23  #     def __init__(self,name):
      24  #         self.name = name
      25  #     def pay(self,money):
      26  #         dic = {'name': self.name, 'number': money}
      27  #         # 想办法调用苹果支付 url连接 把dic传过去
      28  #         print('%s通过苹果支付%s钱成功' % (self.name, money))
      29 30  # aw = WeChat('alex')
      31  # aw.pay(400)
      32  # aa = Alipay('alex')
      33  # aa.pay(400)
      34  # 归一化设计
      35  # def pay(name,price,kind):
      36  #     if kind == 'Wechat':
      37  #         obj = WeChat(name)
      38  #     elif kind == 'Alipay':
      39  #         obj = Alipay(name)
      40  #     elif kind == 'Apple':
      41  #         obj = Apple(name)
      42  #     obj.pay(price)
      43  #
      44  # pay('alex',400,'Wechat')
      45  # pay('alex',400,'Alipay')
      46  # pay('alex',400,'Apple')
      47 48  # appa = Apple('alex')
      49  # appa.fuqian(500)

       

       1  # 实现抽象类的另一种方式,约束力强,依赖abc模块
       2  # from abc import ABCMeta,abstractmethod
       3  # class Payment(metaclass=ABCMeta):
       4  #     @abstractmethod
       5  #     def pay(self,money):pass
       6  #         '''只要你见到了项目中有这种类,你要知道你的子类中必须实现和pay同名的方法'''
       7  #
       8  # class Alipay(Payment):
       9  #     def __init__(self,name):
      10  #         self.name = name
      11  #     def pay(self,money):
      12  #         dic = {'uname':self.name,'price':money}
      13  #         # 想办法调用支付宝支付 url连接 把dic传过去
      14  #         print('%s通过支付宝支付%s钱成功'%(self.name,money))
      15  #
      16  # class WeChat(Payment):
      17  #     def __init__(self,name):
      18  #         self.name = name
      19  #     def pay(self,money):
      20  #         dic = {'username':self.name,'money':money}
      21  #         # 想办法调用微信支付 url连接 把dic传过去
      22  #         print('%s通过微信支付%s钱成功'%(self.name,money))
      23  #
      24  # WeChat('alex')

       

  4. 多态:python处处是多态,一切皆对象

    1. 什么是多态:一个类表现出的多种形态,实际上是通过继承来完成的

    2. 在java情况下: 一个参数必须制定类型所以如果想让两个类型的对象都可以传,那么必须让这两个类继承自一个父类,在制定类型的时候使用父类来指定

  5. 鸭子类型:有同一个方法的叫做鸭子类型(__iter__以及__next__都叫鸭子类型)这不是继承

posted @ 2019-01-23 14:59  .如影随行  阅读(159)  评论(0编辑  收藏  举报