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.

Method Resolution Order (MRO), birden fazla sınıf aynı method adına sahip olduğunda Python'ın 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__ kullanarak MRO'yu kontrol edin:

print(C.__mro__)

Output:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

__mro__ özniteliği, çözünürlük sırasındaki tüm sınıfları içeren bir demettir (tuple). İlk eleman (__mro__[0]) her zaman sınıfın kendisidir (C), ardından soldan sağa doğru üst sınıflar (önce A, sonra B) ve son olarak yerleşik object sınıfı gelir.

Bir nesne oluşturun ve yöntemi çağırın:

c = C()
print(c.method())

Çıktı:

Method from A

Python, yöntemi ilk olarak A sınıfında buldu (MRO'daki 1. dizinde), bu yüzden onu kullandı.

Aradaki 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())

Output:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

Şimdi Python B'nin metodunu ilk sırada bulur çünkü kalıtım listesinde B, A'dan önce gelir. MRO içindeki belirli sınıflara indeksleme kullanarak erişebilirsiniz - D.__mro__[0] D'nin kendisidir, D.__mro__[1] B'dir ve D.__mro__[2] A'dır.

Ayrıca mro() metodunu da kullanabilirsiniz:

print(C.mro())

mro() ve __mro__ aynı sınıf sırasını sağlasa da tür açısından farklılık gösterirler: __mro__ bir tuple döndürürken, mro() bir list döndürür.

Key Point: Python, metotları MRO sırasında arar - önce sınıfın kendisi (indeks 0), ardından sınıf tanımında listelendiği soldan sağa doğru üst sınıflar (indeksler 1, 2, vb.). Bulunan ilk metot kullanılır.

challenge icon

Görev

Orta

Bu görevde 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 türeyen Screen sınıfını uygulayın
  • computer.py: Device sınıfından türeyen Computer sınıfını uygulayın
  • laptop.py: Çoklu kalıtım (multiple inheritance) içeren Laptop sınıfını uygulayın
  • driver.py - Uygulamanızın doğru çalıştığını doğrulayacak test durumlarını uygulayın

Her dosya, uygulama boyunca size adım adım rehberlik edecek detaylı TODO yorumları içerir.

Kendin dene

# TODO: Tüm gerekli sınıfları içe aktar
# 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'yu (Method Resolution Order) yazdır
    # TODO: Biçim: "MRO for [class name]:" (not: iki nokta üst üsteden sonra BOŞLUK YOK)
    # TODO: Sınıfın adını almak için class_name.__name__ kullan
    # TODO: MRO demetini almak için class_name.__mro__ kullan
    # TODO: MRO'daki her sınıf adını ayrı satırlara yazdır
    
    # TODO: Sınıfın bir örneğini oluştur
    # TODO: Örnek üzerinde power_on() çağır ve sonucu sakla
    # TODO: Print: "Power on result: [result]"
    # TODO: Daha iyi okunabilirlik için boş bir satır yazdır
    pass


# Kodunu test et
# TODO: explain_mro() fonksiyonunu her sınıfla çağır: 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