如果兩個類具有同名的屬性和方法的時候就可以使用繼承,例如b類繼承a類,那麼在b類中就有類a中的屬性以及方法。被繼承的類叫做父類,繼承的而得類叫做子類。繼承是物件導向程式設計的第二個特性。一般來說,父類是一些公有的屬性和方法,因此類的繼承能夠減少**的冗餘,提公升**的可讀性,提高開發效率。幾乎在所有物件導向的程式設計中,object類是所有物件的最終繼承的類,「祖宗!」。
格式: class 子類名(父類名):
類方法的呼叫順序:
子類----->父類----->二級父類------>.......----->object
繼承關係是沒有限制的,當在子類物件呼叫乙個方法的時候,如果子類的定義中有這個方法的定義就呼叫子類中的那個方法;如果沒有那個方法的定義,就往上看父類有沒有這個方法,如果一直到object類都沒有找到這個方法的定義就會報錯。
當子類中定義了和父類的乙個同名方法時叫做重寫父類的方法。一般來說當父類的方法不能滿足子類需求的時候就需要在子類中重寫這個方法。
class dog:
def eat(self):
print("吃**")
def description(self):
print("this is a dog!")
class junquan(dog):
def eat(self):
print("吃肉")
jq = junquan()
jq.eat()
jq.description()
結果:吃肉
this is a dog!
子類物件如果呼叫和父類中同名的方法時預設只會呼叫自己的方法,在方法中使用super(子類名,self)便可呼叫到父類的方法。如下**:
class dog:
def eat(self):
print("吃**")
class junquan(dog):
def eat(self):
super(junquan, self).eat() #得到juanquand的父類,然後呼叫它的eat()方法。
print("吃肉")
jq = junquan()
jq.eat()
結果:吃**
吃肉
定義子類物件的時候會呼叫父類的__init__方法來初始化自身的屬性,如果子類中含有父類中沒有的屬性就需要重寫父類的__init__方法。如下**。此時會發現如果在子類的__init__方法中只定義了子類特有的屬性,那麼繼承自父類的屬性反而沒有了。因此如果開啟最後一行的注釋會報錯。
class dog:
def __init__(self):
self.name = "旺旺"
class junquan(dog):
def __init__(self):
self.attri = "搜救"
jq = junquan()
print(jq.attri)
#print(jq.name)
結果:搜救
正確的方式是在子類的__init__方法中使用super(子類名,self).__init__(父類屬性的引數),此時子類的__init__方法需要在定義的時候新增乙個引數。一般來說super()是寫在子類__init__方法的第一行的。
class dog:
def __init__(self,name):
self.name = name
class junquan(dog):
def __init__(self,name):
super(junquan, self).__init__(name)
self.attri = "搜救"
jq = junquan("軍犬")
print(jq.attri)
print(jq.name)
結果:搜救
軍犬
類繼承只是針對類的公有屬性和方法,不能繼承類的私有屬性和方法。子類如果想要訪問父類的私有屬性只能通過父類自身的set()和get()方法。
當子類想同時擁有多個父類的方法時可以 同時繼承多個父類,格式: class 子類名(父類1,父類2)
class a:
def funa(self):
print("function from a")
class b:
def funb(self):
print("function from b")
class c(a,b):
pass
c = c()
c.funa()
c.funb()
結果:function from a
function from b
在多繼承中如果兩個父類中有同名的方法,那麼在子類呼叫方法的時候預設呼叫的是第乙個父類的方法。
class a:
def funa(self):
print("function from a")
def discription(self):
print("this is a")
class b:
def funb(self):
print("function from b")
def discription(self):
print("this is b")
class c(a,b):
pass
c = c()
c.funa()
c.funb()
c.discription()
結果:function from a
function from b
this is a
檢視繼承鏈:子類名.__mro__()
python之路 鑽石繼承
繼承順序 class a object deftest self print from a class b a deftest self print from b class c a deftest self print from c class d b deftest self print fro...
Python學習之路31 繼承的利弊
流暢的python 筆記 本篇是 物件導向慣用方法 的第五篇,我們將繼續討論繼承,重點說明兩個方面 繼承內建型別時的問題以及多重繼承。概念比較多,較為枯燥。內建型別 c語言編寫 的方法通常會忽略使用者重寫的方法,這種行為體現在兩方面 以dict的 getitem 方法為例,即使這個方法被子類重寫了,...
python 類 繼承 python 類的繼承
1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...