Metot Çözümleme Sırası
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 21 / 64.
Metot Çözümleme Sırası (MRO), birden fazla sınıf aynı metot adına sahip olduğunda Python'un metotları aramak için kullandığı sıradır.
İşte aynı metoda sahip birden fazla sınıfın bulunduğu bir örnek:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
passMRO'yu __mro__ kullanarak kontrol edin:
print(C.__mro__)Çıktı:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)__mro__ özniteliği, çözümleme sırasındaki tüm sınıfları içeren bir demettir (tuple). İlk öğe (__mro__[0]) her zaman sınıfın kendisidir (C), onu soldan sağa ana sınıflar (önce A, sonra B) ve son olarak yerleşik nesne (object) sınıfı takip eder.
Bir nesne oluşturun ve metodu çağırın:
c = C()
print(c.method())Çıktı:
Method from APython, metodu ilk olarak A sınıfında (MRO'da 1. dizinde) buldu, bu yüzden onu kullandı.
Farkı görmek için kalıtım sırasını değiştirin:
class D(B, A): # B artık A'dan önce geliyor
pass
print(D.__mro__)
d = D()
print(d.method())Çıktı:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BŞimdi Python, kalıtım listesinde B, A'dan önce geldiği için önce B'nin metodunu bulur. İndeksleme kullanarak MRO'daki belirli sınıflara erişebilirsiniz - D.__mro__[0] D'nin kendisidir, D.__mro__[1] B'dir ve D.__mro__[2] A'dır.
Ayrıca mro() yöntemini de kullanabilirsiniz:
print(C.mro())Bu, __mro__ ile aynı sonucu verir ancak bir liste olarak.
Önemli Nokta: Python, metotları MRO sırasına göre arar - önce sınıfın kendisi (indeks 0), ardından sınıf tanımında listelendiği şekliyle soldan sağa doğru ebeveyn sınıflar (indeks 1, 2, vb.). Bulunan ilk metot kullanılır.
Görev
OrtaBu meydan okumada, bir sınıf hiyerarşisi uygulayacaksınız.
Şu dosyaları düzenlemeniz gerekecek:
device.py: TemelDevicesınıfını uygulayınscreen.py:Devicesınıfından miras alanScreensınıfını uygulayıncomputer.py:Devicesınıfından miras alanComputersınıfını uygulayınlaptop.py: Çoklu kalıtım ileLaptopsınıfını uygulayındriver.py- Uygulamanızın doğru çalıştığını doğrulayacak test senaryolarını uygulayın
Her dosya, uygulama boyunca size adım adım rehberlik edecek ayrıntılı TODO yorumları içerir.
Kopya kağıdı
Metot Çözümleme Sırası (Method Resolution Order - MRO), birden fazla sınıf aynı metot adına sahip olduğunda Python'un metotları aramak için kullandığı dizidir.
MRO'yu __mro__ veya mro() kullanarak kontrol edin:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
pass
print(C.__mro__)
print(C.mro()) # Liste olarak aynı sonuçPython metotları MRO sırasına göre arar - önce sınıfın kendisi, ardından sınıf tanımında listelendiği gibi soldan sağa doğru ebeveyn sınıflar:
c = C()
print(c.method()) # "Method from A" - A, B'den önce gelir
class D(B, A): # B artık A'dan önce gelir
pass
d = D()
print(d.method()) # "Method from B" - B, A'dan önce gelirKendin dene
# TODO: Gerekli tüm sınıfları içe aktarın
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: Verilen sınıf için MRO (Metot Çözümleme Sırası) bilgisini yazdırın
# TODO: Format: "MRO for [class name]:" (not: iki nokta üst üste işaretinden sonra boşluk YOK)
# TODO: Sınıf adını almak için class_name.__name__ kullanın
# TODO: MRO demetini almak için class_name.__mro__ kullanın
# TODO: MRO'daki her bir sınıf adını ayrı satırlara yazdırın
# TODO: Sınıfın bir örneğini oluşturun
# TODO: Örnek üzerinde power_on() metodunu çağırın ve sonucu saklayın
# TODO: Yazdırın: "Power on result: [result]"
# TODO: Daha iyi okunabilirlik için boş bir satır yazdırın
pass
# Kodunuzu test edin
# TODO: Her bir sınıf ile explain_mro() fonksiyonunu çağırın: Device, Screen, Computer ve Laptop
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı