OOP程式設計|我拿你當朋友,你卻把我當爸爸
1.我拿你當朋友,你拿我當爸爸
5月10日,在法國大選第二輪投票中,馬克龍戰勝了極右翼政黨的勒龐,並在14日就職,成為最年輕的法國總統。39歲的政壇小鮮肉火了,一同火起來的,還有他的妻子布麗吉特,以及他們飽受爭議的愛情。
曾經,布麗吉特是馬克龍的中學老師。而布麗吉特的大女兒勞倫斯,又和馬克龍是同班同學。所以,當時他們的關係是這樣的:
之前的關係圖
最終,有情人終成眷屬。馬克龍成為了布麗吉特的丈夫,所以他們的關係變成了這樣:
之後的關係圖
勞倫斯應該會想:這讓我情何以堪?
馬克龍則心理暗爽:我拿你當朋友,你卻拿我當爸爸。
貴圈套路深,還是回農村,農村路更滑,還是碼程式碼吧。然而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這一項技能了。類的繼承減少了程式碼的重複,但是儘量在程式碼關係清楚的情況下使用。否則又產生“我拿你當朋友,你拿我當爸爸”的情況。