今日内容:
1.面向对象:继承
1.面向对象:继承
目的:提高代码的复用性,减少冗余
继承的称呼:
1.父类--子类
2.基类--派生类
3.超类(父类)
1.1单继承:
格式:
# object是所有类的父类 class A(object): # 规范写法,object也可省,默认不写继承于object pass class B(A): # B是A的子类,A是B的父类 pass
猫狗的例子:
共同的属性,某些共同的方法,可以放在一个动物的大类中,让其继承。
class Animal(object): def __init__(self,name,kind): self.name = name self.kind = kind def eat(self,food): print('%s 吃 %s.'%(self.name,food)) def drink(self): print('%s 喝水.'%self.name) def catch(self): print('%s catch mouse.'%(self.name)) class Cat(Animal): def climb(self): print('%s climb tree.'%(self.name)) class Dog(Animal): pass cat = Cat('mao','黑猫') dog = Dog('H','白狗') print(cat.name) dog.drink()
加载顺序:
注:Animal类上面还有一个object父类
dog对象调用drink方法的流程为:
先找到自己的对象空间,通过类指针找到父类Dog,通过父类指针找到Animal类执行的drink方法。
在子类进行重写父类方法,继续使用父类该方法的内容:
1.super关键字
super().方法名(参数) # 默认会传入当前对象
2.类名调用
父类名.方法名(self,参数) # 需要自己写上self
查看继承的类:
类名.__bases__ # 返回一个元祖
1.2多继承
多继承是python独有的一种。
新式类: # 广度优先
python3:默认所有类继承object,所有类都是新式类
python2:类继承了object类为新式类
经典类: # 深度优先
python2:不写继承默认为经典类
广度优先:
如果有共同的根,不会先遍历到根,会走其他路遍历完,最后在遍历到根。
深度优先:
不管有没有共同的根,遍历到底,在遍历另一边,如果有共同的根,一条路遍历后另一条会在根前停止。
绿:广度优先 蓝: 深度优先
该图的例子:
class A(object): pass class B(A): pass class C(A): pass class D(B,C): pass print(D.mro()) # 显示c3算法的的继承顺序 # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] # c3算法 # 使用于广度优先 # A : [A0] # 单继承一个O # B : [BAO] # 单继承A # C : [CAO] # 单继承A # D : [DBCAO] # 多继承B,C # D的步骤: # 1.D : D,[BAO],[CAO] # 从左至右取 # 2.D :[DB],[AO],[CAO] # 左边和右边出现一样的,取右边 # 3.D :[DBC],[AO],[AO] # 取右边 # 4.D :[DBCA],[O],[O] # 取了一样的删除左右相同的 # 5.D :[DBCAO],[],[] # 取完
1.3 super要注意的
super调用父类方法是根据mro(3c算法)的顺序。