Menu
Coddy logo textTech

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):
    pass

MRO'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 A

Python, 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.

challenge icon

Görev

Orta

Bu meydan okumada, bir sınıf hiyerarşisi uygulayacaksınız.

Şu dosyaları düzenlemeniz gerekecek:

  • device.py: Temel Device sınıfını uygulayın
  • screen.py: Device sınıfından miras alan Screen sınıfını uygulayın
  • computer.py: Device sınıfından miras alan Computer sınıfını uygulayın
  • laptop.py: Çoklu kalıtım ile Laptop sınıfını uygulayın
  • driver.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 gelir

Kendin 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
quiz iconKendini test et

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