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):
passSprawdź 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 APython 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 BTeraz 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.
Wyzwanie
ŚredniW tym wyzwaniu zaimplementujesz hierarchię klas.
Musisz edytować te pliki:
device.py: Zaimplementuj bazową klasęDevicescreen.py: Zaimplementuj klasęScreen, która dziedziczy poDevicecomputer.py: Zaimplementuj klasęComputer, która dziedziczy poDevicelaptop.py: Zaimplementuj klasęLaptopz wielokrotnym dziedziczeniemdriver.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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online