繼承有什么好處?最大的好處是子類獲得了父類的全部功能。
判斷一個變量是否是某個類型可以用isinstance()判斷:
>>>isinstance(a, list)
True
這就是多態真正的威力:調用方只管調用,不管細節
對擴展開放:允許新增Animal子類;
對修改封閉:不需要修改依賴Animal類型的run_twice()等函數。
動態語言的“鴨子類型”,它并不要求嚴格的繼承體系,一個對象只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。
在評論區的一個串聯整篇的例子
#定義一個父類一個子類
class Province(object):
? ? def __init__(self,proname):
? ? ? ? self.proname=proname
? ? def ps(self):
? ? ? ? print('I am in %s'%self.proname)
class City(Province):
? ? def __init__(self,proname,cityname):
? ? ? ? self.cityname=cityname?
? ? ? ? Province.__init__(self,proname)
? ? def ps1(self):
? ? ? ? print('I\'m in %s-%s' %(self.proname,self.cityname))
#定義一個獨立的類
class Timer(object):
? ? def ps(self):
? ? ? ? print('我不屬于Province類或其子類,但我有ps方法我同樣可以被調用')
? ? def ps1(self):
? ? ? ? print('我不屬于Province類或其子類,但我有ps1方法我同樣可以被調用')
#定義一個函數
def f(x):
? ? x.ps()
? ? x.ps1()
#調用部分
f(City('上海','浦東'))
f(Timer())
返回結果I am in上海I'm in上海-浦東
我不屬于Province類或其子類,但我有ps方法我同樣可以被調用我不屬于Province類火氣子類,但我有ps1方法我同樣可以被調用