super方法

一、引入

上一节课程我们知道,如果父类中的方法在派生的子类中不能满足其需求的话,可以在子类中通过重写解决这个问题

但是

很多情况下,父类中的方法并不是全部一点都不能用,即子类的需求往往是在父类方法实现的功能基础上提出了更多的需求而已,此时如果我们在子类中重写此方法时就会发现出现了很多冗余的代码,这个问题该怎么解决呢?

答:在子类重写的方法中通过调用父类中被重写的方法

二、示例1

class Father(object):
    def play_game(self):
        print("父类中的play_game")


class Son(Father):
    def play_game(self):
        super().play_game()  # 先调用父类被重写的方法
        print("子类中的play_game")  # 然后再添加子类需要的新功能


son = Son()
son.play_game()  # 调用子类中的方法,因为在子类中重写了play_game方法

运行效果

父类中的play_game
子类中的play_game

三 、示例2

class Father(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "%s的年龄是:%d" % (self.name, self.age)


class Son(Father):
    def __init__(self, name, age, collage):
        super().__init__(name, age)
        self.collage = collage

    def __str__(self):
        return "%s的年龄是:%d,他的学历是:%s" % (self.name, self.age, self.collage)


father = Father("父亲", 50)
print(father)

son = Son("儿子", 18, "大学")
print(son)

运行效果

父亲的年龄是:50
儿子的年龄是:18,他的学历是:大学

四、示例3

class Father(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "%s的年龄是:%d" % (self.name, self.age)


class Son(Father):
    def __init__(self, name, age, collage):
        super().__init__(name, age)
        self.collage = collage

    def __str__(self):
        return "%s的年龄是:%d,他的学历是:%s" % (self.name, self.age, self.collage)


class GrandChild(Son):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("----这里模拟其要做的额外事情....----")


father = Father("父亲", 50)
print(father)

son = Son("儿子", 18, "大学")
print(son)

grandchild = GrandChild("孙子", 1, "未上学")
print(grandchild)

运行效果

父亲的年龄是:50
儿子的年龄是:18,他的学历是:大学
----这里模拟其要做的额外事情....----
孙子的年龄是:1,他的学历是:未上学

五、总结

  • 如果想要在子类方法中调用被重写的父类方法就可以使用super().父类方法名()