導航:首頁 > 編程語言 > python多繼承初始化方法

python多繼承初始化方法

發布時間:2024-08-25 11:47:31

python3多繼承該怎麼寫(是同時繼承多個父類)

classjc(Car,Lunzi):
def罩旦__init__(self,paizi,xiaohao,year,lz,x):
Car.__init__(self,paizi,xiaohao,year)
Lunzi.__init__(self,lz)
self.x=x
a=jc('悔禪111'碧悶塵,'111',111,111,111)
print(a.paizi)

❷ Python子類繼承,如果不用父類的函數和方法,應該怎麼寫

子類繼承父類時,如果父類有需要初始化的屬性,那麼必須在子類中調用父類的初始化方法,幫助父類進行初始化,否則,子類可以不調用父類的初始化方法

代碼示例

"""
父類Car中沒有屬性需要初始化,所有子類中也不需要調用父類的初始化方法
"""


classCar:

defshow_name(self):
print('carname')


classEeleCar(Car):
pass


car=EeleCar()
car.show_name()

❸ Python涓澶氱戶鎵跨殑鐞嗚В錛

9.5.1. 澶氱戶鎵
Python 鍚屾牱鏈夐檺鐨勬敮鎸佸氱戶鎵垮艦寮忋傚氱戶鎵跨殑綾誨畾涔夊艦濡備笅渚:
class DerivedClassName(Base1, Base2, Base3):

鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝鍦ㄦ渶綆鍗曠殑鎯呭喌涓嬶紝浣犺兘鎯沖埌鐨勬悳緔㈠睘鎬т粠鐖剁被緇ф壙鐨勬繁搴︿紭鍏堬紝宸﹀埌鍙籌紝鑰屼笉鏄鎼滅儲涓ゆ″湪鍚屼竴涓綾誨眰嬈$粨鏋勪腑錛屽叾涓鏈変竴涓閲嶅彔銆傚洜姝わ紝濡傛灉鍦 DerivedClassName 錛堢ず渚嬩腑鐨勬淳鐢熺被錛変腑娌℃湁鎵懼埌鏌愪釜灞炴э紝灝變細鎼滅儲 Base1錛岀劧鍚庯紙閫掑綊鐨勶級鎼滅儲鍏跺熀綾伙紝濡傛灉鏈緇堟病鏈夋壘鍒幫紝灝辨悳緔 Base2錛屼互姝ょ被鎺ㄣ
瀹為檯涓婏紝super() 鍙浠ュ姩鎬佺殑鏀瑰彉瑙f瀽欏哄簭銆傝繖涓鏂瑰紡鍙瑙佷簬鍏跺畠鐨勪竴浜涘氱戶鎵胯璦錛岀被浼 call-next-method錛屾瘮鍗曠戶鎵胯璦涓鐨 super 鏇村己澶 銆
鍔ㄦ佽皟鏁撮『搴忓嶮鍒嗗繀瑕佺殑錛屽洜涓烘墍鏈夌殑澶氱戶鎵誇細鏈変竴鍒板氫釜鑿卞艦鍏崇郴錛堟寚鏈夎嚦灝戜竴涓紲栧厛綾誨彲浠ヤ粠瀛愮被緇忕敱澶氫釜緇ф壙璺寰勫埌杈撅級銆備緥濡傦紝鎵鏈夌殑 new-style 綾葷戶鎵胯嚜 object 錛屾墍浠ヤ換鎰忕殑澶氱戶鎵挎繪槸浼氭湁澶氫簬涓鏉$戶鎵胯礬寰勫埌杈 object 銆
涓轟簡闃叉㈤噸澶嶈塊棶鍩虹被錛岄氳繃鍔ㄦ佺殑綰挎у寲綆楁硶錛屾瘡涓綾婚兘鎸変粠宸﹀埌鍙崇殑欏哄簭鐗瑰埆鎸囧畾浜嗛『搴忥紝姣忎釜紲栧厛綾誨彧璋冪敤涓嬈★紝榪欐槸鍗曡皟鐨勶紙鎰忓懗鐫涓涓綾昏緇ф壙鏃朵笉浼氬獎鍝嶅畠紲栧厛鐨勬″簭錛夈傛葷畻鍙浠ラ氳繃榪欑嶆柟寮忎嬌寰楄捐′竴涓鍙闈犲苟涓斿彲鎵╁睍鐨勫氱戶鎵跨被鎴愪負鍙鑳姐傝繘涓姝ョ殑鍐呭硅峰弬瑙 http://www.python.org/download/releases/2.

❹ Python類的多重繼承問題深入分析

Python類的多重繼承問題深入分析
首先得說明的是,Python的類分為經典類 和 新式類
經典類是python2.2之前的東西,但是在2.7還在兼容,但是在3之後的版本就只承認新式類了
新式類在python2.2之後的版本中都可以使用
經典類和新式類的區別在於:
經典類是默認沒有派生自某個基類的,而新式類是默認派生自object這個基類的:
代碼如下:
# old style
class A():pass
# new style
class A(obejct):pass
2.經典類在類多重繼承的時候是採用從左到右深度優先原則匹配方法的..而新式類是採用C3演算法(不同於廣度優先)進行匹配的
3.經典類是沒有__MRO__和instance.mro()調用的,而新式類是有的.
為什麼不用經典類,要更換到新式類
因為在經典類中的多重繼承會有些問題...可能導致在繼承樹中的方法查詢繞過後面的父類:
代碼如下:
class A():
def foo1(self):
print "A"
class B(A):
def foo2(self):
pass
class C(A):
def foo1(self):
print "C"
class D(B, C):
pass
d = D()
d.foo1()
按照經典類的查找順序從左到右深度優先的規則,在訪問d.foo1()的時候,D這個類是沒有的..那麼往上查找,先找到B,裡面沒有,深度優先,訪問A,找到了foo1(),所以這時候調用的是A的foo1(),從而導致C重寫的foo1()被繞過.
所以python引入了新式類的概念,每個基類都繼承自object並且,他的匹配規則也從深度優先換到了C3
C3演算法
C3演算法是怎麼做匹配的呢..在問答版塊上面討論之後,歸結如下:
C3演算法的一個核心是merge.
在merge列表中,如果第一個序列mro的第一個類是出現在其它序列,並且也是第一個,或者不出現其它序列,那麼這個類就會從這些序列中刪除,並合到訪問順序列表中
比如:(引用問題中zhuangzebo的回答@zhuangzebo)
代碼如下:
class A(O):pass
class B(O):pass
class C(O):pass
class D(A,B):pass
class E(C,D):pass

首先需要知道 O(object)的mro(method resolution order)列表是[O,]
那麼接下來是:
代碼如下:
mro(A) = [A, O]
mro(B) = [B, O]
mro(C) = [C, O]
mro(D) = [D] + merge(mro(A), mro(B), [A, B])
= [D] + merge([A, O], [B, O], [A, B])
= [D, A] + merge([O], [B, O], [B])
= [D, A, B] + merge([O], [O])
= [D, A, B, O]
mro(E) = [E] + merge(mro(C), mro(D), [C, D])
= [E] + merge([C, O], [D, A, B, O], [C, D])
= [E, C] + merge([O], [D, A, B, O], [D])
= [E, C, D] + merge([O], [A, B, O])
= [E, C, D, A, B] + merge([O], [O])
= [E, C, D, A, B, O]

然後還有一種特殊情況:
比如:
merge(DO,CO,C) 先merge的是D
merge(DO,CO,C) 先merge的是C
意思就是.當出現有 一個類出現在兩個序列的頭(比如C) 這種情況和 這個類只有在一個序列的頭(比如D) 這種情況同時出現的時候,按照順序方式匹配。
新式類生成的訪問序列被存儲在一個叫MRO的只讀列表中..
你可以使用instance.__MRO__或者instance.mro()來訪問
最後匹配的時候就按照MRO序列的順序去匹配了
C3和廣度優先的區別:
舉個例子就完全明白了:
代碼如下:
class A(object):pass
class B(A):pass
class C(B):pass
class D(A):pass
class E(D):pass
class F(C, E):pass

按照廣度優先遍歷,F的MRO序列應該是[F,C,E,B,D,A]
但是C3是[F,E,D,C,B,A]
意思是你可以當做C3是在一條鏈路上深度遍歷到和另外一條鏈路的交叉點,然後去深度遍歷另外一條鏈路,最後遍歷交叉點
新式類和經典類的super和按類名訪問問題
在經典類中,你如果要訪問父類的話,是用類名來訪問的..
代碼如下:
class A():
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
A.__init__(self) #python不會默認調用父類的初始化函數的

這樣子看起來沒三問題,但是如果類的繼承結構比較復雜,會導致代碼的可維護性很差..
所以新式類推出了super這個東西...
代碼如下:
class A():
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
super(B,self).__init__()

這時候,又有一個問題:當類是多重繼承的時候,super訪問的是哪一個類呢?
super實際上是通過__MRO__序列來確定訪問哪一個類的...實際上就是調用__MRO__中此類後面的一個類的方法.
比如序列為[F,E,D,C,B,A]那麼F中的super就是E,E的就是D
super和按照類名訪問 混合使用帶來的坑
代碼如下:
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(object):
def __init__(self):
print "enter B"
print "leave B"
class C(A):
def __init__(self):
print "enter C"
super(C, self).__init__()
print "leave C"
class D(A):
def __init__(self):
print "enter D"
super(D, self).__init__()
print "leave D"
class E(B, C):
def __init__(self):
print "enter E"
B.__init__(self)
C.__init__(self)
print "leave E"
class F(E, D):
def __init__(self):
print "enter F"
E.__init__(self)
D.__init__(self)
print "leave F"
這時候列印出來是:
代碼如下:
enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F

可以看出來D和A的初始化函數被亂入了兩次!
按類名訪問就相當於C語言之前的GOTO語句...亂跳,然後再用super按順序訪問..就有問題了
所以建議就是要麼一直用super,要麼一直用按照類名訪問
最佳實現:
避免多重繼承
super使用一致
不要混用經典類和新式類
調用父類的時候注意檢查類層次
以上便是本人對於python類的繼承的認識了,希望對大家能有所幫助

❺ Python中的面向對象(高級)之私有方法、多繼承、多態

特徵:私有屬性與私有方法不能從外部被調用,也不能被子類繼承

唯一寫法:在屬性或方法前面加上__(兩個下劃線)

我們寫一個簡單的例子,創建一個類,包含私有方法、私有屬性、普通方法、普通屬性,並生成一個實例

私有屬性和私有方法可以從內部被調用(總不能我寫了,但是哪都不讓用吧)

我們試試在類里再加入一個新的方法,調用私有方法和屬性

可以看到,私有屬性和私有方法是可以在類內部被調用的。

舉個私有屬性應用場景的例子


二。object類

我們試一下


三。多繼承

一個子類可以繼承多個父類,用逗號隔開

多個父類中有同名方法時,按照繼承順序進行調用


四。多態

當不同的實例,有同名的方法時,我們可以一個函數,傳入不同的實例,執行對應的方法。

我們定義一個貓和一個狗的類,兩個類中都有'叫'的方法。並各生成一個實例。

定義一個函數,用函數來調用'叫'的方法

這就叫多態。

閱讀全文

與python多繼承初始化方法相關的資料

熱點內容
android判斷電話 瀏覽:162
如何刪除安卓手機里的安裝包 瀏覽:648
2021影視小程序源碼激勵廣告 瀏覽:202
java編程培訓機構 瀏覽:686
dtu源碼資料zip 瀏覽:696
蘋果6p是安卓的什麼配置 瀏覽:56
語音通話降噪演算法 瀏覽:474
pdf被加密不能列印 瀏覽:47
html內部伺服器錯誤什麼意思 瀏覽:768
加密金融風投是什麼 瀏覽:1001
未來之翼為什麼連接不了伺服器 瀏覽:563
手動壓縮噴霧器 瀏覽:654
linuxtimeval 瀏覽:703
煤氣罐解壓閥需要調緊嗎 瀏覽:234
兒研所APP為什麼沒有耳鼻喉科 瀏覽:1000
androidapp界面素材 瀏覽:820
一台伺服器主機建50台雲桌面 瀏覽:605
手機解壓了的圖片 瀏覽:885
stm32快閃記憶體編程教程 瀏覽:515
javassh管理系統源碼 瀏覽:7