Python之类的继承
生活随笔
收集整理的這篇文章主要介紹了
Python之类的继承
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有時候我們會寫多個類,那么類與類之間是可以有繼承關系的。
例如:
#!/usr/bin/env?python #-*-coding:utf-8-*-class?father:def?__init__(self):self.fname?=?'fff'def?func(self):print?'father.func'class?son(father):def?__init__(self):self.sname?=?'sss'def?bar(self):print?'son.bar's1?=?son() s1.bar() s1.func()輸出結果:
son.bar father.func son.抽煙從上面的例子可以看到
父類中的方法可以被子類繼承并調用,調用方式為類.父類中方法名
子類可以繼承父類,并重寫父類中的方法
例如:
#!/usr/bin/env?python #-*-coding:utf-8-*- class?father:def?__init__(self):self.fname?=?'fff'def?func(self):print?'father.func'def?bad(self):print?'father.抽煙喝酒' class?son(father):def?__init__(self):self.sname?=?'sss'def?bar(self):print?'son.bar'def?bad(self):print?'son.抽煙' s1?=?son() s1.bar() s1.func()輸出結果:
son.bar father.func son.抽煙子類怎么調用父類的構造函數?
在子類的構造函數中執行父類名.__init__(self)即可
#!/usr/bin/env?python #-*-coding:utf-8-*- class?father:def?__init__(self):self.fname?=?'fff'print?'father.init'def?func(self):print?'father.func'def?bad(self):print?'father.抽煙喝酒' class?son(father):def?__init__(self):self.sname?=?'sss'print?'son.init'father.__init__(self)def?bar(self):print?'son.bar'def?bad(self):print?'son.抽煙' s1?=?son() s1.bar()輸出結果:
son.init father.init son.bar經典類和新式類
新式類在類名后面有(object)標識。
經典類和新式類的區別:
經典類在類的多重繼承時,有一個bug,就是:應該是廣度優先,但在多重繼承后變成了深度優先。
#!/usr/bin/env?python #-*-coding:utf-8-*- class?A:def?__init__(self):print?'This?is?A'def?save(self):print?'save?from?A' class?B(A):def?__init__(self):print?'This?is?B' class?C(A):def?__init__(self):print?'This?is?C'def?save(self):print?'save?from?C' class?D(B,C):def?__init__(self):print?'This?is?D' c?=?D() c.save()輸出結果
從上例可知,D類繼承了B和C兩個類,并且B優先繼承(多重繼承時,左邊優先繼承)
由于B類中沒有save方法,而B繼承了A,所以D中在繼承B時,save方法應該是A類中的save方法。而D又繼承了C類,所以最后D類中的最后的sava方法應該是繼承C類的,但是上面的結果是D繼承了A類。所以這是一個明顯的bug。
我們把上例換成新式類在測試下結果:
#!/usr/bin/env?python #-*-coding:utf-8-*- class?A(object):def?__init__(self):print?'This?is?A'def?save(self):print?'save?from?A' class?B(A):def?__init__(self):print?'This?is?B' class?C(A):def?__init__(self):print?'This?is?C'def?save(self):print?'save?from?C' class?D(B,C):def?__init__(self):print?'This?is?D' c?=?D() c.save()輸出結果:
This?is?D save?from?C總結:新式類修復了經典類的一些bug,并且完全兼容經典類。所以建議使用新式類。
?
轉載于:https://blog.51cto.com/zengestudy/1858476
總結
以上是生活随笔為你收集整理的Python之类的继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】使用Navicat for Ora
- 下一篇: python 知识 rstrip,str