1. 程式人生 > >OOP程式設計|我拿你當朋友,你卻把我當爸爸

OOP程式設計|我拿你當朋友,你卻把我當爸爸

1240

1.我拿你當朋友,你拿我當爸爸

5月10日,在法國大選第二輪投票中,馬克龍戰勝了極右翼政黨的勒龐,並在14日就職,成為最年輕的法國總統。39歲的政壇小鮮肉火了,一同火起來的,還有他的妻子布麗吉特,以及他們飽受爭議的愛情。

曾經,布麗吉特是馬克龍的中學老師。而布麗吉特的大女兒勞倫斯,又和馬克龍是同班同學。所以,當時他們的關係是這樣的:

1240
之前的關係圖

最終,有情人終成眷屬。馬克龍成為了布麗吉特的丈夫,所以他們的關係變成了這樣:

1240
之後的關係圖

勞倫斯應該會想:這讓我情何以堪?

馬克龍則心理暗爽:我拿你當朋友,你卻拿我當爸爸。

貴圈套路深,還是回農村,農村路更滑,還是碼程式碼吧。然而python中的OOP一樣可以這麼亂。

2.OOP的繼承與多型

之前介紹過python面向物件程式設計,它可以輕鬆地建立一個類,使任務從步驟化變為模組化,方便程式的管理和使用。類能夠方便管理使用的原因之一,是因為類的方法可以繼承和重寫,因而具有繼承和多型性。也是正因如此,使用不當就會變得很混亂。

繼承描述了兩個類的關係,即一個類的大部分屬性和方法是從另一個類中獲得。也就是一個子類,繼承了父類的屬性方法。通過繼承的方式,可以省略掉重複的程式碼,方便地建立功能相似的新類。“子類”和“父類”也可以叫做“派生類”和“基類”。繼承語法如下:

class子類名(父類名):

1.隱式繼承(implicit inheritance)

子類中來自父類的方法和屬性可以省略,省略的功能便以隱式繼承的形式存在。還是舉加班的例子,底薪200,1個字0.1¥,分別寫了兩篇稿件,1000字和2500字,計算勞務費,用如下方式建立一個子類:

class parent(object):

    def __init__(self, num):

        self.cal = num

    def pay(self):

        self.pay =200+self.cal /10

        print self.pay

class child (parent):

#隱式繼承父類所有方法pass

father = parent(1000)

son = child(2500)

father.pay()

son.pay()

輸出:

300

450

當呼叫子類中的函式時,子類中並不存在,那麼python就會去父類中查詢並呼叫。而“pass”只是一個佔位符,讓結構顯得更好看,沒有實際意義。

2.顯式覆蓋(override)

隱式繼承完全繼承了父類的特性,如果讓子類實現一些新功能時,可以重寫方法,即名稱不變,內容換新。假設父類指加班寫稿的勞務,子類為日常寫稿勞務,日常寫稿底薪為100:

class parent(object):

    def __init__(self, num):

        self.cal = num

    def pay(self):

        self.pay =200+self.cal/10

        print self.pay

class child(parent):

#覆蓋父類中的方法

    def pay(self):

        self.pay =100+self.cal/10

        print self.pay

father = parent(1000)

son = child(1000)

father.pay()

son.pay()

輸出:

300

200

3.隨時切換

有時在程式中我們覆蓋了父類的方法,又想重新呼叫,那麼可以使用語法如下:

super(子類名,self).父類方法()

接著上面的例子,想在呼叫子類的時候,即執行覆蓋後的方法,又呼叫父類的方法:

class parent(object):

    def __init__(self, num):

        self.cal = num

    def pay(self):

        self.pay =200+self.cal/10

        print self.pay

class child(parent):

    def pay(self):

        self.pay =100+self.cal/10

        print self.pay

        super(child,self).pay()

        #呼叫父類中的方法

son = child(1000)

son.pay()

輸出:

200

300

看到這裡,大家或許已經get這一項技能了。類的繼承減少了程式碼的重複,但是儘量在程式碼關係清楚的情況下使用。否則又產生“我拿你當朋友,你拿我當爸爸”的情況。