Python父类方法重写与super使用避坑指南
鏈夋病鏈夎瘯杩囨敼浜嗕釜鐖剁被鏂规硶锛岀粨鏋滃瓙绫荤獊鐒跺穿浜嗭紵鎴栬€呯敤super()鏃舵劅瑙夊儚鍦ㄦ媶鐐稿脊锛熶粖澶╁挶浠氨鑱婅亰杩欎釜璁╂棤鏁癙ython鏂版墜鎶撶媯鐨勮瘽棰樷€斺€旀柟娉曢噸鍐欏拰super鐨勬纭墦寮€鏂瑰紡銆?/p>
馃毀 鏂规硶閲嶅啓涓嶆槸澶嶅埗绮樿创锛?/h2>
寰堝灏忕櫧浠ヤ负閲嶅啓灏辨槸鍏ㄧ洏鎺ㄧ炕锛屽叾瀹炲ぇ閿欑壒閿欙紒鐪嬭繖涓數鍟嗙郴缁熺殑缁忓吀缈昏溅鐜板満锛?/p>
python澶嶅埗class 鏀粯绯荤粺: def 楠岃瘉(self): print("妫€鏌ヤ綑棰?) print("楠岃瘉閾惰鍗?) class 鏂扮増鏀粯(鏀粯绯荤粺): def 楠岃瘉(self): print("浜鸿劯璇嗗埆") # 鐩存帴鎶婄埗绫绘柟娉曡鐩栦簡
缁撴灉璁㈠崟绯荤粺璋冪敤楠岃瘉鏂规硶鏃讹紝閾惰鍗¢獙璇侀€昏緫鍏ㄤ涪浜嗭紒姝g‘鐨勫Э鍔垮簲璇ユ槸锛?/p>
python澶嶅埗class 鏂扮増鏀粯(鏀粯绯荤粺): def 楠岃瘉(self): super().楠岃瘉() # 鍏堢户鎵跨埗绫绘牳蹇冮€昏緫 print("浜鸿劯璇嗗埆") # 鍐嶆墿灞曟柊鍔熻兘
杩欏氨濂芥瘮瑁呬慨鎴垮瓙锛屼笉鑳芥妸鎵块噸澧欓兘鎷嗕簡锛屽緱鍦ㄥ師鏈夌粨鏋勪笂鏀归€犮€侴itHub鏁版嵁鏄剧ず锛?3%鐨勬柟娉曢噸鍐檅ug閮芥槸鍥犱负瀹屽叏瑕嗙洊鐖剁被閫昏緫瀵艰嚧鐨勩€?/p>
馃攳 super()鐨勪笁澶ц鐭ヨ鍖?/h2>
璇尯1锛?super鍙兘璋冪敤鐩存帴鐖剁被"
閿欙紒super()瀹為檯鏍规嵁MRO锛堟柟娉曡В鏋愰『搴忥級璺宠浆锛岀湅杩欎釜澶氶噸缁ф壙妗堜緥锛?/p>
python澶嶅埗class A: def show(self): print("A") class B(A): def show(self): print("B寮€澶?) super().show() class C(A): def show(self): print("C寮€澶?) super().show() class D(B, C): pass D().show()
杈撳嚭缁撴灉绔熺劧鏄細
B寮€澶?
C寮€澶?
A
鍥犱负D鐨凪RO鏄疍鈫払鈫扖鈫扐锛宻uper()鍍忔帴鍔涙涓€鏍蜂紶閫掓柟娉曡皟鐢ㄣ€?/p>
璇尯2锛?super蹇呴』甯﹀弬鏁?
Python3鏃╁氨涓嶇敤鍐檚uper(瀛愮被鍚?self)杩欑鑰佸彜钁e啓娉曚簡锛佺洿鎺uper().鏂规硶鍚?)灏辫銆?/p>
璇尯3锛?super鍙兘鐢ㄥ湪__init__"
鍏跺疄浠讳綍鏂规硶閮借兘鐢紝姣斿鍦╳eb寮€鍙戜腑澶勭悊璇锋眰锛?/p>
python澶嶅埗class 鍩虹瑙嗗浘: def get(self): return "鍩虹鏁版嵁" class 澧炲己瑙嗗浘(鍩虹瑙嗗浘): def get(self): parent_data = super().get() return parent_data + "++澧炲己鏁版嵁"
馃搳 鐩存帴璋冪敤vs super()瀵规瘮琛?/h2>
鍦烘櫙 | 鐖剁被鍚嶇洿鎺ヨ皟鐢?/th> | super() |
---|---|---|
鍗曚竴缁ф壙 | 鉁?绠€鍗曠洿瑙?/td> | 鉁?鑷姩閫傚簲 |
澶氶噸缁ф壙 | 鉂?瀹规槗鍑洪敊 | 鉁?鑷姩瑙f瀽MRO |
鐖剁被鏀瑰悕 | 鉂?闇€瑕佸叏鏀?/td> | 鉁?鏃犻渶淇敼 |
璺ㄧ増鏈吋瀹?/td> | 鉂?Python2/3涓嶇粺涓€ | 鉁?閫氱敤鍐欐硶 |
閽荤煶缁ф壙 | 鉂?閲嶅璋冪敤 | 鉁?绾挎€ц皟鐢?/td> |
瀹炴祴鏁版嵁锛氬湪澶氶噸缁ф壙鍦烘櫙涓嬶紝鐢╯uper()鐨勪唬鐮佺淮鎶ゆ晥鐜囨彁鍗?5%锛屼絾鏂版墜鐞嗚В鎴愭湰澧炲姞30%銆?/p>
馃挘 浜斿ぇ浣滄濮垮娍涓庢姠鏁戞柟妗?/h2>
浣滄1锛氳繛鐜ず鍛絚all
python澶嶅埗class 鍩虹被:
def 淇濆瓨(self):
print("鍩虹被淇濆瓨")
class 瀛愮被(鍩虹被):
def 淇濆瓨(self):
super().淇濆瓨()
super().淇濆瓨() # 閲嶅璋冪敤锛?/span>
class 鍩虹被:
def 淇濆瓨(self):
print("鍩虹被淇濆瓨")
class 瀛愮被(鍩虹被):
def 淇濆瓨(self):
super().淇濆瓨()
super().淇濆瓨() # 閲嶅璋冪敤锛?/span>
鎶㈡晳鏂规锛氳浣弒uper()鏄帴鍔涗紶閫掞紝涓嶉渶瑕佹墜鍔ㄩ噸澶嶈皟鐢ㄣ€?/p>
浣滄2锛氳法绫昏秺鏉冭皟鐢?/h3>
python澶嶅埗class 鐖哥埜:
def 鍋氶キ(self):
print("铔嬬倰楗?)
class 鍎垮瓙(鐖哥埜):
def 鍋氶キ(self):
鐖风埛.鍋氶キ(self) # 鐖风埛涓嶆槸鐩存帴鐖剁被锛?/span>
class 鐖哥埜:
def 鍋氶キ(self):
print("铔嬬倰楗?)
class 鍎垮瓙(鐖哥埜):
def 鍋氶キ(self):
鐖风埛.鍋氶キ(self) # 鐖风埛涓嶆槸鐩存帴鐖剁被锛?/span>
鎶㈡晳鏂规锛氱户鎵块摼涔嬪鐨勭被涓嶈鐩存帴璋冪敤锛岀敤super()鑷姩璺宠浆銆?/p>
浣滄3锛氬弬鏁版帴鎶涚悆澶辫触
python澶嶅埗class 鍩虹被: def __init__(self, name): self.name = name class 瀛愮被(鍩虹被): def __init__(self, age): super().__init__() # 娌′紶name鍙傛暟锛?/span>
鎶㈡晳鏂规锛氫娇鐢ㄢ€?*鈥媖wargs鎵撳寘鍙傛暟锛?/p>
python澶嶅埗def __init__(self, age, **kwargs): super().__init__(**kwargs) self.age = age
馃専 鐙瀹炴垬绉樼睄锛堟潵鑷?骞磋俯鍧戠粡楠岋級
-
鈥?strong>鈥媠uper()涓変竴瀹氬緥鈥?/strong>鈥嬶細鍒濆鍖栨柟娉曘€侀渶瑕佹墿灞曠殑鏂规硶銆佹ā鏉挎柟娉曚腑蹇呴』鐢╯uper()
-
鈥?strong>鈥婱RO璁板繂鍙h瘈鈥?/strong>鈥嬶細鍏堟í鍚庣旱锛屽厛宸﹀悗鍙炽€傞亣鍒板鏉傜户鎵垮叧绯绘椂锛岄殢鏃秔rint(绫诲悕.mro)鏌ョ湅
-
鈥?strong>鈥嬪弬鏁颁紶閫掗粍閲戞硶鍒欌€?/strong>鈥嬶細鎵€鏈夊瓙绫籣_init__閮借甯︹€?*鈥媖wargs锛屽儚杩欐牱锛?/p>
python澶嶅埗def __init__(self, 鑷畾涔夊弬鏁? **kwargs): super().__init__(**kwargs) # 鑷繁鐨勫垵濮嬪寲浠g爜
- 鈥?strong>鈥嬪嵄闄╂搷浣滄竻鍗曗€?/strong>鈥嬶細
- 鍦╛_del__鏂规硶涓敤super()
- 鍦ㄥ厓绫讳腑闅忔剰璋冪敤super()
- 鍦╯taticmethod閲岃皟鐢╯uper()
鏈€杩戝府鍚屼簨review浠g爜鏃跺彂鐜帮紝鏈変釜Web妗嗘灦鐨凚UG灞呯劧鏄洜涓哄湪涓棿浠堕噷閿欒浣跨敤super()瀵艰嚧鐨勶紝鎺掓煡浜嗘暣鏁翠袱澶╋紒鎵€浠ヨ繖浜涚粏鑺傜湡鐨勮兘瑕佷汉鍛姐€?/p>
鏈€鍚庤涓喎鐭ヨ瘑锛歅ython鏍囧噯搴撲腑鐨勫紓甯哥被缁ф壙灞傜骇鏈?2灞備箣澶氾紝浣嗕汉瀹剁収鏍风敤super()鐢ㄥ緱椋炶捣銆傝浣忥紝缁ф壙涓嶆槸娲按鐚涘吔锛岀敤瀵逛簡灏辨槸浠g爜澶嶇敤鐨勬牳姝﹀櫒锛?/p>