自动化软件测试 -- Python 继承

一、单继承:子类只继承一个父类

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()不支持执行多个父类的同名方法。

你可能感兴趣的