Python'da MRO (Method Resolution Order) nedir? super() çoklu kalıtımda nasıl çalışır?
Cevap
MRO, bir metot veya attribute aranırken sınıfların hangi sırayla taranacağını belirler. Python 2.3'ten beri C3 linearization algoritması kullanılır. Sırayı Sinif.__mro__ veya Sinif.mro() ile görebilirsiniz.
class A:
def hello(self):
print("A")
class B(A):
def hello(self):
print("B"); super().hello()
class C(A):
def hello(self):
print("C"); super().hello()
class D(B, C):
def hello(self):
print("D"); super().hello()
D().hello()
print([k.__name__ for k in D.__mro__])Çıktı:
D
B
C
A
['D', 'B', 'C', 'A', 'object']Önemli nokta: super() "üst sınıf" demek değildir
super() MRO'daki bir sonraki sınıfı çağırır. B içindeki super().hello() burada A'yı değil C'yi çağırır, çünkü nesne bir D'dir ve D'nin MRO'sunda B'den sonra C gelir. Bu sayede "elmas" (diamond) yapısında A.hello yalnızca bir kez çalışır.
C3 kuralları
- Alt sınıf her zaman üst sınıflarından önce gelir.
- Base sınıfların listelendiği sıra korunur (
D(B, C)ise B, C'den önce). - Tutarlı bir sıra kurulamıyorsa sınıf tanımı
TypeError: Cannot create a consistent method resolution orderhatası verir.
Pratik kullanım: cooperative multiple inheritance ve mixin'ler
Django class-based view'larındaki LoginRequiredMixin gibi mixin'ler bu mekanizmaya dayanır; mixin'ler base sınıftan önce yazılır. Her sınıfın super().__init__(**kwargs) çağırması gerekir, aksi halde zincir kopar.
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.