Soru Tarihi:
super() fonksiyonu, kalıtımla çalışmayı kolaylaştırmak amacıyla ortaya çıkmıştır. Onun öncesinde, üst sınıfın yöntemlerini çağırırken açıkça üst sınıfın adını belirtmek gerekiyordu, bu da karışma ve çoklu kalıtımın rahatsız edici olmasına yol açabiliyordu ve hatalara neden olabiliyordu. super(), kalıtım sırasını (MRO) dikkate alır.
Sorun:
Çoklu kalıtımda, üst sınıfa doğrudan başvurmak genellikle sadece onun yöntemlerini çağırır, diğer ata sınıfları göz ardı eder. Bu, çağrı zincirini bozar. super()'in görevi, hiyerarşiyi göz önünde bulundurarak yöntemlerin doğru bir zincirini oluşturmaktır.
Çözüm:
super() bir proxy nesnesi döner, bu nesne çağrıları MRO sırasındaki bir sonraki sınıfa delegeler. Bu, tüm ataların yöntemlerini zincir boyunca tutarlı bir şekilde çağırmayı sağlar.
Kod Örneği:
class A: def show(self): print("A.show()") class B(A): def show(self): print("B.show() -> ", end="") super().show() class C(A): def show(self): print("C.show() -> ", end="") super().show() class D(B, C): def show(self): print("D.show() -> ", end="") super().show() d = D() d.show() # Çıktı: D.show() -> B.show() -> C.show() -> A.show()
Temel Özellikler:
Statik yöntemlerde argüman olmadan super kullanmak mümkün mü?
Hayır, statik yöntemlerde ne self ne de cls bulunur. super()'in, nesne veya sınıf metodundan çağrılması beklenir; burada nesne türü ile ilgili bilgilerin bulunması gerekir.
Eğer super() ile çağrı zincirinde bir üst sınıf yöntemini atlıyorsanız, o yöntem çağrılacak mı?
Hayır. Zincirde super() çağrılmadıysa, işlem "devredilmeyecek". Bu yüzden yöntemleri yeniden tanımlarken her zaman super()'i hatırlamak önemlidir, aksi halde ataların bazı mantığı göz ardı edilebilir.
super()'e rastgele argümanlar verebilir miyiz?
Verilebilir, ancak Python 3'te argüman olmadan kullanılan olağan super() şekli hataları önlemek için ve daha temiz bir görünüm sunduğundan tercih edilir. Argüman ile geçiş, yalnızca nadir durumlarda (örneğin, Python 2 ile uyumluluk) gereklidir ve çoğunlukla ihtiyaç duyulmaz.
Artılar:
Olumsuz Durum: Büyük bir projede üst sınıf başlatma içeriyordu, ancak bir alt sınıf super().init() çağrısını unuttu. Sonuç olarak, bazı özellikleri başlatılmamış kısmen başlatılmış nesneler oluştu.
Artılar: Her bir üst sınıfı manuel olarak çağırma ihtiyacı yoktu. Eksiler: Birinin super()'i atlaması durumunda izleme zorluğu.
Olumlu Durum: İyi şekilde uygulanmış bir super() zinciri, tüm temel sınıfların doğru başlatılmasını sağladı ve mimarinin bakım ve gelişimini kolaylaştırdı.
Artılar: Kodun temizliği, genişletme kolaylığı. Eksiler: Karmaşık MRO durumlarında hata yapma olasılığı yüksektir — çağrı sırasını anlamak gerekir.