1. 程式人生 > >Python中的super函式

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 方法。