Çoklu kalıtım, bir sınıfın birden fazla üst sınıftan miras alabilme yeteneği, Python'da nesne yönelimli programlama (OOP) dillerinden (örneğin, C++) esinlenerek ortaya çıkmıştır; bu, yeniden kullanılabilir miksinler oluşturmaya yardımcı olur. Yöntem arama mekanizması (MRO) geliştirilmesi, yöntem çakışmalarında öngörülebilirlik sağlamak için uzun zaman almıştır.
Bir sınıf, farklı temel sınıflardan aynı isme sahip yöntemler alabilir. Çağrıldığında hangi yöntemin kullanılacağını nasıl belirleyeceğiz? Belirsiz bir şemayla, bu zor tespit edilebilecek hatalara yol açabilir.
Python, çakışmaların çözümünde katı bir yöntem arama sırası belirleyen MRO algoritmasını (C3 linearyzasyonu) uygular. super() fonksiyonu ve sınıfların __mro__ yöntemi kullanılarak kalıtım zincirinin analizi yapılırken her şey şeffaf hale gelir.
Kod örneği:
class A: def foo(self): print("A") class B(A): def foo(self): print("B") super().foo() class C(A): def foo(self): print("C") super().foo() class D(B, C): def foo(self): print("D") super().foo() D().foo() print(D.__mro__)
Temel özellikler:
__mro__ sınıf niteliği aracılığıyla görüntülenebilir;Eğer üst sınıf yöntemlerinin isimleri çakışırsa ne olur?
Cevap: Yöntem çağrısı MRO'ya göre belirlenen sırada gerçekleşir. Zincir boyunca ilk bulunan uygun isimli yöntem çalışır.
super() ifadesini açıkça self ile kullanmadan kullanmak mümkün mü?
Cevap: Python 3'te — evet, sınıfın yöntemi içinde super().method() çağrısı açık super(Sınıf, self).method() ile eşdeğerdir, yalnızca sınıf içinde.
Mevcut bir sınıfın MRO sırasını değiştirmek mümkün mü?
Cevap: MRO sırası sınıf tanımlandıktan sonra statikti, ancak araştırılabilir (veya farklı bir kalıtım sırasıyla yeni bir sınıf oluşturulabilir).
Projede benzer yönteme sahip iki miksin oluşturulmuş, kalıtım sınıfı her iki miksini de kullanıyor ancak yöntemleri doğrudan sınıf adıyla çağırıyor, olayları sıralamayı bozuyor.
Artılar:
Eksiler:
Her miksinin her yönteminde super() kullanıyorlar, bu da zincir boyunca çağrıyı garanti ediyor, gerekli davranışın atlanmamasını sağlıyor.
Artılar:
Eksiler: