[問題] super() 與MRO 鏈斷裂問題

作者: leolarrel (真.粽子無雙)   2026-02-24 16:54:10
Gemini 教我說類別就算是基底類別也要在__init__() 中加入super().__init__()
以防這個類別被不知道的人採用多重繼承來繼承這個基底類別, 然後說這樣這個
類別就不會被叫"不合群",導致類別初始化時 __init__() MRO chain 斷裂.
她講得煞有介事, 可是我怎麼找都找不到網路文章有提到這件事
這事到底是不是真的?
作者: s0914714 (YA)   2026-02-25 01:21:00
如果啥都沒繼承應該是不用吧?就是單純繼承object的情況
作者: leolarrel (真.粽子無雙)   2026-02-26 16:26:00
我後來已經放棄"繼承"了,改用組合
作者: s0914714 (YA)   2026-02-26 18:13:00
大部分情況都不需要用到很複雜的繼承 組合會好一點
作者: timTan (用口頭禪區分年記)   2026-03-21 10:15:00
寫了沒壞處是真的
作者: ddavid (謊言接線生)   2026-03-27 11:38:00
都問 AI 了,你就叫它寫一個最小可重現案例來證明它會出事,實際跑看看就知道它是不是瞎說了
作者: leolarrel (真.粽子無雙)   2026-03-27 13:00:00
樓上,一開始就有做了依他的實驗的確會出事,但奇怪這麼重要的事情網路論壇都沒討論串,在這問也沒幾個人知道,讓我懷疑再懷疑
作者: cuteSquirrel (松鼠)   2026-03-28 10:02:00
獅子專業
作者: ddavid (謊言接線生)   2026-03-31 17:48:00
有實例就是事實了,而之所以沒有太多人談,有可能是其實會觸發這個問題的 pattern 並沒有那麼常見,掉坑的人不多XD首先,如果只是單繼承串發生這問題,很容易發現錯誤而且一般外部 package 都不會發生這問題,也就是要發生得一般是自己寫的繼承關係,還要剛好有觸發條件畢竟用了繼承也不一定每一層都會初始化,常常底層只是介面然後繼承的實作層才在初始化,然後不會再往下一層了現在也不推崇用一堆層層疊疊過度設計的繼承,有些情況可取代方案很多

Links booklink

Contact Us: admin [ a t ] ucptt.com