繼承
什麼時候用繼承(__dict__)
1.當類之間有顯著不同,並且較小的類是較大的類所需要的元件時,用組合比較好
如:描述乙個機器人類,機械人這個大類是由很多不相關的小類組成,如機器胳膊類,腿類,身體類
2.當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好
如 貓可以:喵喵叫、吃、喝、拉、撒、
狗可以:汪汪叫、吃、喝、拉、撒、
繼承同時具有兩種含義
含義一:繼承基類的方法,並且做出自己的改變或者擴充套件(**重用)
含義二:宣告某個子類相容於某基類,定義乙個介面類,子類繼承介面類,並且實現介面中定義的方法
實踐中,繼承的第一種含義意義並不很大,甚至常常是有害的。因為它使得子類與基類出現強耦合
繼承的第二種含義非常重要。叫「介面繼承」
介面繼承實質上實要求「做出乙個良好的抽象,這個抽象規定了乙個相容介面,使得外部呼叫者無需關心具體細節,
可一視同仁的處理實現了特定介面的所有物件「---這在程式設計上,叫做歸一化。
歸一化使得高層的外部使用者可以不加區分的處理所有介面相容的物件集合
1.就好象linux的泛檔案概念一樣,所有東西都可以當檔案處理,不必關心它是記憶體、磁碟、網路還是螢幕
(當然,對底層設計者,當然也可以區分出「字元裝置」和「塊裝置」,然後做出針對性的設計:
細緻到什麼程度,視需求而定)。
2.再比如:我們有乙個汽車介面,裡面定義了汽車所有的功能,然後由本田汽車的類,奧迪汽車的類,大眾汽車的類,
他們都實現了汽車介面,這樣就好辦了,大家只需要學會了怎麼開汽車,那麼無論是本田,還是奧迪,
還是大眾我們都會開了,開的時候根本無需關心我開的是哪一類車,操作手法(函式呼叫)都一樣
from abc import abcmeta,abstractmethod
class pet(object,metaclass=abcmeta):
'''寵物'''
def __init__(self,nickname):
self._nickname=nickname
@abstractmethod
def make_voice(self):
'''發出聲音'''
pass
class dog(pet):
'''狗'''
def make_voice(self):
print("%s:汪汪汪..."%self._nickname)
class cat(pet):
'''貓'''
def make_voice(self):
print("%s:喵喵喵"%self._nickname)
def main():
pets=[dog('旺財'),cat('凱蒂'),dog('大黃')]
for pet in pets:
pet.make_voice()
if __name__=='__main__':
main()
mro列表並遵循如下三條準則:
1.子類會先於父類被檢查
2.多個父類會根據它們在列表中的順序被檢查
3.如果對下乙個類存在兩個合法的選擇,選擇第乙個父類
子類呼叫父類的方法
class vehicle:
country='china'
def __init__(self,name,speed,load,power):
self.name=name
self.speed=speed
self.load=load
self.power=power
def run(self):
print('開動啦')
print('開動啦')
class subway(vehicle):
def __init__(self,name,speed,load,power,line):
vehicle.__init__(self,name,speed,load,power)
self.line=line
def show_info(self):
print(self.name,self.speed,self.load,self.power,self.line)
def run(self):
vehicle.run(self)
print('%s %s 線,開動啦' %(self.name,self.line))
line13=subway('北京地鐵','10km/s',1000000000,'電',13)
line13.show_info()
line13.run()
super()方法
class vehicle1:
country='china'
def __init__(self,name,speed,load,power):
self.name=name
self.speed=speed
self.load=load
self.power=power
def run(self):
print('開動啦')
print('開動啦')
class subway(vehicle1):
def __init__(self,name,speed,load,power,line):
# vehicle.__init__(self,name,speed,load,power)
# super().__init__(name,speed,load,power) #super(__class__,self).__init__(name,speed,load,power)
super(subway,self).__init__(name,speed,load,power)
self.line=line
def show_info(self):
print(self.name,self.speed,self.load,self.power,self.line)
def run(self):
# vehicle.run(self)
super().run()
print('%s %s 線,開動啦' %(self.name,self.line))
line13=subway('北京地鐵','10km/s',1000000000,'電',13)
line13.show_info()
line13.run()
print(line13.__class__)
python學習之繼承
python學習之繼承 物件導向程式設計 oop 語言的乙個主要功能就是 繼承 繼承是指這樣一種能力 它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。通過繼承建立的新類稱為 子類 或 派生類 被繼承的類稱為 基類 父類 或 超類 繼承的過程,就是從一般到特殊的過程...
python學習之繼承
class p object p class def init self print created an instance of self.class name def foo self print hi,i am p foo class c p def foo self p.foo self 子...
python學習之繼承和多型
home miao python python3 coding utf 8 這是關於繼承和多型 class parent object def init self,name,age self.name name self.age age defget name self print self.nam...