Menu
Coddy logo textTech

Kolejność rozwiązywania metod

Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 21 z 64.

Kolejność rozwiązywania metod (MRO) to kolejność, w jakiej Python szuka metod, gdy wiele klas ma metodę o tej samej nazwie.

Oto przykład z wieloma klasami mającymi tę samą metodę:

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

Sprawdź MRO za pomocą __mro__:

print(C.__mro__)

Wynik:

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

Atrybut __mro__ to krotka zawierająca wszystkie klasy w kolejności rozstrzygania. Pierwszym elementem (__mro__[0]) jest zawsze sama klasa (C), następnie klasy nadrzędne od lewej do prawej (A, potem B), a na końcu wbudowana klasa object.

Utwórz obiekt i wywołaj metodę:

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

Wynik:

Method from A

Python najpierw znalazł metodę w klasie A (na indeksie 1 w MRO), więc użył właśnie jej.

Zmień kolejność dziedziczenia, aby zobaczyć różnicę:

class D(B, A):  # B występuje teraz przed A
    pass

print(D.__mro__)
d = D()
print(d.method())

Wynik:

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

Teraz Python najpierw znajduje metodę klasy B, ponieważ B występuje przed A na liście dziedziczenia. Możesz uzyskać dostęp do konkretnych klas w MRO za pomocą indeksowania — D.__mro__[0] to sama klasa D, D.__mro__[1] to B, a D.__mro__[2] to A.

Możesz też użyć metody mro():

print(C.mro())

Chociaż mro() i __mro__ zwracają tę samą sekwencję klas, różnią się typem: __mro__ zwraca krotkę, natomiast mro() zwraca listę.

Najważniejsze: Python szuka metod w kolejności MRO — najpierw w samej klasie (indeks 0), a następnie w klasach nadrzędnych od lewej do prawej, zgodnie z kolejnością podaną w definicji klasy (indeksy 1, 2 itd.). Używana jest pierwsza znaleziona metoda.

challenge icon

Wyzwanie

Średni

W tym wyzwaniu zaimplementujesz hierarchię klas.

Musisz edytować te pliki:

  • device.py: Zaimplementuj bazową klasę Device
  • screen.py: Zaimplementuj klasę Screen, która dziedziczy po Device
  • computer.py: Zaimplementuj klasę Computer, która dziedziczy po Device
  • laptop.py: Zaimplementuj klasę Laptop z wielokrotnym dziedziczeniem
  • driver.py - Zaimplementuj przypadki testowe, które sprawdzą, czy Twoja implementacja działa poprawnie

Każdy plik zawiera szczegółowe komentarze TODO, które krok po kroku poprowadzą Cię przez implementację.

Spróbuj swoich sił

# TODO: Zaimportuj wszystkie wymagane klasy
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: Wypisz MRO (kolejność rozstrzygania metod) dla podanej klasy
    # TODO: Format: "MRO for [class name]:" (uwaga: BEZ spacji po dwukropku)
    # TODO: Użyj class_name.__name__, aby uzyskać nazwę klasy
    # TODO: Użyj class_name.__mro__, aby uzyskać krotkę MRO
    # TODO: Wypisz nazwy klas z MRO, każdą w osobnym wierszu
    
    # TODO: Utwórz instancję klasy
    # TODO: Wywołaj power_on() na instancji i zapisz wynik
    # TODO: Wypisz: "Power on result: [result]"
    # TODO: Wypisz pustą linię dla lepszej czytelności
    pass


# Przetestuj swój kod
# TODO: Wywołaj explain_mro() dla każdej klasy: Device, Screen, Computer i Laptop
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online