Python çoklu mirası destekler ve ebeveyn metodlarının çağrıları, metodların çözümleme sırası (MRO - Method Resolution Order) ile yönetilir. super() işlevi, bir hiyerarşide üst sınıfın metodunu çağırmayı sağlar ve özellikle karmaşık miras durumlarında faydalıdır.
super(), MRO'ya göre metodların doğru çağrılmasını garanti eder, sadece doğrudan ebeveynden değil.
class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # Çıktı: # D # B # C # A
İnce ayrıntılar: Her metodun super() çağrısı yapması zorunludur, aksi takdirde MRO "bozulacaktır". Ayrıca, yapıcılar (__init__) super().__init__() çağrısını yapmalıdır.
Soru: Çoklu miras hiyerarşisinde bir sınıf metodunda super() çağrısını "unutursa" ne olur?
Cevap: MRO bozulur, ebeveynlerin bazı metodları çağrılmaz. Örnek:
class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # Çıktı: D B # A metodları C ve A hiç çağrılmaz
Hikaye
super().__init__() çağrısını unuttular. Sonuç olarak, bir widget doğru bir şekilde başlatılmadı ve bu sadece nadir bir hatayla "gösterildi".Hikaye
Hikaye
Bir miksin hiyerarşisinde, bir metod override edildiğinde super() çağrısını "unutmuştu". Bu, bir API endpoint'inde doğrulamanın çalışmamasına, diğerinde ise düzgün geçmesine neden oldu. Hata, MRO'nun manuel olarak incelenmesi sonucu haftalar sonra bulundu.