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 order hatası 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.

  1. list ve tuple arasındaki fark nedir?KolayPythonBackend
  2. Varsayılan argüman olarak liste vermek neden tehlikelidir?OrtaPythonBackend
  3. Decorator nedir? Basit bir zamanlama decorator'ı yazın.OrtaPythonBackend
  4. Generator nedir, yield ne yapar?OrtaPythonBackend
  5. GIL nedir ve çoklu iş parçacığını nasıl etkiler?ZorPythonBackend
  6. async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?ZorPythonBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle