閱讀621 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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}
  1. 如果此時有一個類繼承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__

此時的結果一樣是

{}
  1. 在類的多繼承中會產生什麼狀況呢?(在多繼承中會運行類的繼承參數中的第一個參數聲明的父類中的__init__函數,如果父類中沒有__init__函數,繼續尋找父類的父類中有沒有,以此類推。。。如果找到了頭還是沒有,則換為第二個參數聲明的父類,過程如第一個參數,知道找到__init__函數為止,如果都沒有找到,則不初始化),代碼可以根據前麵例子自己測試。
  • 對於在子類中調用父類中的方法的super的使用與特性,下節再來談。
  • 總結:如果想了解python虛擬機具體是怎麼創建類的(具體到當加載一個.pyc文件時,是怎麼通過c語言的代碼邏輯來把類對象放到一塊內存中的,我也在了解這方麵的內容,希望咱們一塊探索)

最後更新:2017-04-01 16:42:10

  上一篇:go 優雲automation輕鬆“一點”,搞定裸機安裝係統
  下一篇:go 阿裏雲ET的下一個目標:擔任“實習醫生“