Python中的super函数

对于初始化函数的继承,跟一般方法的继承,还有点不同。
先看下面的例子:

class Person(object):
    def __init__(self):
        self.height = 160

    def about(self, name):
        print("{} is about {}".format(name,self.height))


class Girl(Person):
    def __init__(self):
        self.breast = 90

    def about(self, name):
        print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast))


if __name__ == "__main__":
    cang = Girl()
    cang.about("wangguniang")

1.在上面这段程序中,类 Girl 继承了类 Person。在类 Girl 中,初始化设置了 self.breast = 90 ,由于继承了 Person,按照前面的经验,Person 的初始化函数中的self.height = 160 也应该被 Girl 所继承过来。然后在重写的about 方法中,就是用 self.height 。
2.实例化类 Girl,并执行cang.about(“wangguniang”) ,试图打印出一句话 wangguniang is a hot girl, she is ab
out 160, and her bereast is 90 。
运行结果:

File "C:/Users/dell/Desktop/python/practice/test.py", line 136, in about
    print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast))
AttributeError: 'Girl' object has no attribute 'height'

1.报错信息显示 self.height 是不存在的。也就是说类Girl 没有从 Person 中继承过来这个属性。
2.原因是什么?仔细观察类 Girl,会发现,除了刚才强调的 about 方法重写了, init 方法,也被重写了。不要认为它的名字模样奇怪,就不把它看做类中的方法(函数),它跟类 Person 中的 init 重名了,也同样是重写了那个初始化函数。

下面为改正之后的程序

class Person(object):
    def __init__(self):
        self.height = 160

    def about(self, name):
        print("{} is about {}".format(name,self.height))


class Girl(Person):
    def __init__(self):
        self.breast = 90
        super(Girl, self).__init__()      #使用super()

    def about(self, name):
        print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast))
        super(Girl, self).about(name)    #使用super()


if __name__ == "__main__":
    cang = Girl()
    cang.about("wangguniang")

运行结果:

wangguniang is a hot girl, she is about 160, and her breast is 90
wangguniang is about 160

因为在子类中重写了某个方法之后,父类中同样的方法被遮盖了。那么如何再把父类的该
方法调出来使用呢?
Python 中有这样一种方法,这种方式是被提倡的方法:super 函数。
在子类中, init 方法重写了,为了调用父类同方法,使用 super(Girl, self).init() 的方式。super 函数的参数,第一个是当前子类的类名字,第二个是 self,然后是点号,点号后面是所要调用的父类的方法。同样在子类重写的 about 方法中,也可以调用父类的about 方法。

猜你喜欢

转载自blog.csdn.net/ZHUQIUSHI123/article/details/82966649