广度优先和深度优先 父类对子类的约束 多态 鸭子模型
-
只要继承object的就是新式类,不继承object就是经典类(只存在于python2X)
-
经典类与新式类的多继承
-
在经典类中都是深度优先,在一条路走不通止呕再换一条路,走过的点不会重复
-
新式类中遵循广度优先:C3算法,print(类名.mro())来查看
-
-
父类对子类的约束
-
之前使用的都是普通的类
-
抽象类:是一个开发的规范,约束它的所有子类必须实现一些和它同名的方法
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')
-
-
多态:python处处是多态,一切皆对象
-
什么是多态:一个类表现出的多种形态,实际上是通过继承来完成的
-
在java情况下: 一个参数必须制定类型所以如果想让两个类型的对象都可以传,那么必须让这两个类继承自一个父类,在制定类型的时候使用父类来指定
-
-
鸭子类型:有同一个方法的叫做鸭子类型(
__iter__
以及__next__
都叫鸭子类型)这不是继承