一、单继承:子类只继承一个父类
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
shifu = Master()
shifu.make_cake() # 使用了古法煎饼果子配方,制作了一个煎饼果子
class Damao(Master):
pass
damao = Damao()
damao.make_cake() # 使用了古法煎饼果子配方,制作了一个煎饼果子
虽然子类没有定义__init__ 方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的 __init__ 方法。子类在继承的时候,在定义类时,()中为父类的名字。父类的属性、方法,都会被继承给子类。
二、多继承:子类继承多个父类
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def dayandai(self):
print("抽了一个大烟袋")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_game(self):
print("打了一把5杀")
# shifu = Master()
# shifu.make_cake()
class Damao(Master,School):
pass
damao = Damao()
damao.make_cake() #使用了古法煎饼果子配方,制作了一个煎饼果子
damao.dayandai() #抽了一个大烟袋
damao.play_game() #打了一把5杀
class Damao(School,Master):
pass
damao = Damao()
damao.make_cake() #使用了现代煎饼果子配方,制作了一个煎饼果子
多继承可以继承多个父类,也继承了所有父类的属性和方法。注意:如果多个父类中有同名的属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)。多个父类中,不重名的属性和方法,不会有任何影响。
三、子类重写父类同名属性和方法
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def dayandai(self):
print("抽了一个大烟袋")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_game(self):
print("打了一把5杀")
# shifu = Master()
# shifu.make_cake()
class Damao(Master,School):
def __init__(self):
self.kongfu = "猫式煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
damao = Damao()
print(Damao.__mro__)
damao.make_cake() #使用了猫式煎饼果子配方,制作了一个煎饼果子
damao.dayandai() #抽了一个大烟袋
damao.play_game() #打了一把5杀
四、子类调用父类的同名属性和方法
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def dayandai(self):
print("抽了一个大烟袋")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_game(self):
print("打了一把5杀")
# shifu = Master()
# shifu.make_cake()
class Damao(Master,School):
def __init__(self):
self.kongfu = "猫式煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def make_old_cake(self):
Master.__init__(self)
self.make_cake()
def make_moder_cake(self):
School.__init__(self)
self.make_cake()
damao = Damao()
print(Damao.__mro__)
damao.make_cake() #使用了猫式煎饼果子配方,制作了一个煎饼果子
damao.make_old_cake() #使用了古法煎饼果子配方,制作了一个煎饼果子
damao.make_moder_cake() #使用了现代煎饼果子配方,制作了一个煎饼果子
五、多层继承
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def dayandai(self):
print("抽了一个大烟袋")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_game(self):
print("打了一把5杀")
# shifu = Master()
# shifu.make_cake()
class Damao(Master,School):
def __init__(self):
self.kongfu = "猫式煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def make_old_cake(self):
Master.__init__(self)
self.make_cake()
def make_moder_cake(self):
School.__init__(self)
self.make_cake()
class PreticePrentice(Damao):
pass
pp = PreticePrentice()
pp.make_cake() #使用了猫式煎饼果子配方,制作了一个煎饼果子
pp.make_old_cake() #使用了古法煎饼果子配方,制作了一个煎饼果子
pp.make_moder_cake() #使用了现代煎饼果子配方,制作了一个煎饼果子
六、super
使用super()可以逐一调用所有的父类方法,并且只执行一次,调用顺序遵循mro类属性的顺序。
目前,super()不支持执行多个父类的同名方法。