ProgramlamaPython Kıdemli Geliştirici

Python'da miras modelini ve super() işlevinin çalışmasını açıklayın. Çoklu mirasa sahip olduğunda super() kullanımının özellikleri nelerdir ve hangi hatalar yapılabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Kod örneği:

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.

Kandırmaca soru.

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

Bu konunun inceliklerinden dolayı gerçek hataların örnekleri.


Hikaye

Bir GUI bileşeni mirasında, ara sınıflardan birinde 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

Bir REST API sunucusunda, üst sınıfa bağlı bir logger, MRO'ya göre tüm isteklere "bağlanması" gerekiyordu. Bir sınıf, logger'ı doğrudan çağırdı, bu yüzden çağrı zinciri bozuldu ve mesajlar günlüğe kaydedilmedi — ekip nedenini uzun süre aradı.

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.