首頁  >  文章  >  後端開發  >  實例詳解python中類別的繼承

實例詳解python中類別的繼承

Y2J
Y2J原創
2017-04-28 09:27:021201瀏覽

這篇文章主要介紹了python類別的繼承實例詳解的相關資料,需要的朋友可以參考下

#python 類別的繼承

對於許多文章講解python類別的繼承,大多數都是說一些什麼oop,多態等概念,我認為這樣可能對有一定基礎的開發者幫助不是那麼大,不如直接用在各種情況下所寫的程式碼,來展示對於某一種程式碼情況,程式碼運行會有什麼效果。這樣可能對開發者的幫助更大。不說廢話,直接上程式碼。

這裡不區分經典類別和新式類,下面分析的對新式類別和經典類別都適用

對於類別中的__init__函數,只是一個初始化是呼叫的一個函數(ps:初始化和建立實例並不是一個過程,實例的建立是透過一個create函數來完成的),如果在子類別中沒有顯示的宣告__init__函數,則子類別就會調用父類別的__init__函數,但不會再呼叫父類別的父類別中的__init__函數,如果顯示的宣告了__init__ 函數,則在子類別的初始化的時候就不會呼叫父類別的初始化函數,只會呼叫子類別中宣告的__init__函數, 同時在子類別實例中也不會有父類別__init__函數中宣告的屬性,

範例:

class animal():
 name="hh"
 sex="man"
 def __init__(self):
  self.height=10
  self.weight=50
 def deception(self):
  print "ansible.height:"+self.height+" animal.weight:"+self.weight
 def run(self):
  print "animal is running...."
class dog(animal):
 def __init__(self):
  pass
if __name__=="__main__":
 dg=dog()
 print dg.__dict__

此時執行的結果為

{}

當把dog類別修改為如下時(ps:此時沒有顯示的宣告__init__方法):

class dog(animal):
 def run(self):
  print "dog is running..."

此時由於直接呼叫的父類animal的__init__方法,結果如下:

{'weight': 50, 'height': 10}

如果此時有一個類別繼承dog類,此時會出現什麼情況呢? (python解釋器先在子類別中尋找__init__方法,如果沒有找到,再從父類別中找,直到找到為止,並執行,並且不再執行父類別的父類別的__init__方法,此時沒有執行的__init__方法中的建立的屬性是沒有的,例如上面的例子,第一次執行時得到的例子中並沒有weight和height屬性)

class animal():
 name="hh"
 sex=""
 def __init__(self):
  self.height=10
  self.weight=50
 def deception(self):
  print "ansible.height:"+self.height+" animal.weight:"+self.weight
 def run(self):
  print "animal is running...."
class dog(animal):
 def __init__(self):
  pass
 def run(self):
  print "dog is running..."
class jinmao(dog):
 # def __init__(self):
 #  self.ji="jinmao"
 pass
if __name__=="__main__":
 dg=jinmao()
 print dg.__dict__

此時的結果一樣是

{}

在類別的多重繼承中會產生什麼狀況呢? (在多重繼承中會執行類別的繼承參數中的第一個參數宣告的父類別中的__init__函數,如果父類別中沒有__init__函數,繼續尋找父類別的父類別中有沒有,以此類推。可以根據前面例子自己測試。

對於在子類別中呼叫父類別中的方法的super的使用與特性。

總結:如果想了解python虛擬機具體是怎麼建立類別的(具體到當載入一個.pyc檔時,是怎麼透過c語言的程式碼邏輯來把類別物件放到一塊記憶體中的,我也在了解這方面的內容,希望咱們一塊探索)

以上是實例詳解python中類別的繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn