首页 > 趣闻 > 正文内容

Python父类方法重写与super使用避坑指南

趣闻2025-05-19 15:45:26

鏈夋病鏈夎瘯杩囨敼浜嗕釜鐖剁被鏂规硶锛岀粨鏋滃瓙绫荤獊鐒跺穿浜嗭紵鎴栬€呯敤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>

鎶㈡晳鏂规锛氳浣弒uper()鏄帴鍔涗紶閫掞紝涓嶉渶瑕佹墜鍔ㄩ噸澶嶈皟鐢ㄣ€?/p>

浣滄2锛氳法绫昏秺鏉冭皟鐢?/h3>
python澶嶅埗
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

馃専 鐙瀹炴垬绉樼睄锛堟潵鑷?骞磋俯鍧戠粡楠岋級

  1. 鈥?strong>鈥媠uper()涓変竴瀹氬緥鈥?/strong>鈥嬶細鍒濆鍖栨柟娉曘€侀渶瑕佹墿灞曠殑鏂规硶銆佹ā鏉挎柟娉曚腑蹇呴』鐢╯uper()

  2. 鈥?strong>鈥婱RO璁板繂鍙h瘈鈥?/strong>鈥嬶細鍏堟í鍚庣旱锛屽厛宸﹀悗鍙炽€傞亣鍒板鏉傜户鎵垮叧绯绘椂锛岄殢鏃秔rint(绫诲悕.mro)鏌ョ湅

  3. 鈥?strong>鈥嬪弬鏁颁紶閫掗粍閲戞硶鍒欌€?/strong>鈥嬶細鎵€鏈夊瓙绫籣_init__閮借甯︹€?*鈥媖wargs锛屽儚杩欐牱锛?/p>

python澶嶅埗
def __init__(self, 鑷畾涔夊弬鏁? **kwargs):
    super().__init__(**kwargs)
    # 鑷繁鐨勫垵濮嬪寲浠g爜
  1. 鈥?strong>鈥嬪嵄闄╂搷浣滄竻鍗曗€?/strong>鈥嬶細
  • 鍦╛_del__鏂规硶涓敤super()
  • 鍦ㄥ厓绫讳腑闅忔剰璋冪敤super()
  • 鍦╯taticmethod閲岃皟鐢╯uper()

鏈€杩戝府鍚屼簨review浠g爜鏃跺彂鐜帮紝鏈変釜Web妗嗘灦鐨凚UG灞呯劧鏄洜涓哄湪涓棿浠堕噷閿欒浣跨敤super()瀵艰嚧鐨勶紝鎺掓煡浜嗘暣鏁翠袱澶╋紒鎵€浠ヨ繖浜涚粏鑺傜湡鐨勮兘瑕佷汉鍛姐€?/p>

鏈€鍚庤涓喎鐭ヨ瘑锛歅ython鏍囧噯搴撲腑鐨勫紓甯哥被缁ф壙灞傜骇鏈?2灞備箣澶氾紝浣嗕汉瀹剁収鏍风敤super()鐢ㄥ緱椋炶捣銆傝浣忥紝缁ф壙涓嶆槸娲按鐚涘吔锛岀敤瀵逛簡灏辨槸浠g爜澶嶇敤鐨勬牳姝﹀櫒锛?/p>

搜索