上一篇“面向对象”中简单介绍了继承,即一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。子类可以重写父类方法。继承是为了代码重用。这篇重点写一下重写父类的方法及经典类与新式类在多继承时的区别。

一、重写父类的方法

所谓多继承就是一个子类可以继承多个父类。

重写父类方法的情况有以下两种:
  1、父类的方法一点用没有,直接重新写就好
  2、父类有这个方法,但是它的功能不够完善,想给这个方法在原有基础上再添加一些新功能
    通过 父类名().方法()或者super(子类名,self).方法()来实现

class Daddy():
    def smile(self):
        print('哈哈')

class Daddy1():
    def smile(self):
        print('嘿嘿')

class Son(Daddy,Daddy1):#子类可以继承多个父类
    def smile(self):#重写父类的方法
        Daddy().smile()#调用了父类,先实例化再调用方法
        super(Son,self).smile()#Super这个关键字自动帮你找到父类,Super括号中写(子类,self)
        # 如果Daddy中有smile就调用Daddy中的smile,如果Daddy中没有smile,就去Daddy1中去找smile
        # 按照父类的顺序去寻找smile方法,直到找到就调用,后面的不再调用
        print('呵呵')

s = Son()
s.smile()

二、经典类与新式类的区别

Python3中,经典类与新式类没有任何的区别,多继承都是广度优先

Python2中,多继承的时候经典类是深度优先,新式类是广度优先,经典类里面不能用super方法

#第一个父类B有x这个方法
class A:
    def x(self):
        print('a')
class B(A):
    def x(self):
        print('b')
class C(A):
    def x(self):
        print('a')
class D(B,C):
    pass
d = D()
d.x() #b

#第一个父类B没有x这个方法,经典类深度优先找到A中的x
class A:
    def x(self):
        print('a')
class B(A):
    pass
class C(A):
    def x(self):
        print('a')
class D(B,C):
    pass
d = D()
d.x() #a

#第一个父类B没有x这个方法,新式类广度优先找到C中的x
class A(object):
    def x(self):
        print('a')
class B(A):
    pass
class C(A):
    def x(self):
        print('a')
class D(B,C):
    pass
d = D()
d.x() #c

 

posted on 2018-05-31 16:58  忻冉然  阅读(193)  评论(0编辑  收藏  举报