logo

Metodo sprendimo tvarka Python

Šioje pamokoje mes sužinosime apie metodų skyrimo tvarką, kuri taip pat žinoma kaip MRO. Tai esminė Python paveldėjimo sąvoka.

Metodo sprendimo tvarka aprašo klasės, kuri paieškos kelią Python naudoja, kad gautų atitinkamą metodą klasėse, kuriose yra daugybinis paveldėjimas.

Įvadas

Kaip žinome, klasė, kuri yra paveldima, vadinama poklasiu arba pirmine klase, o paveldima klasė yra žinoma kaip antrinė klasė arba poklasis. Daugelio paveldėjimo atveju klasę gali sudaryti daug funkcijų, todėl metodo raiškos užsakymo technika naudojama ieškant eilės, kuria vykdoma pagrindinė klasė.

Paprastais žodžiais tariant - 'Metodas ar atributai yra tiriami esamoje klasėje, jei metodo nėra dabartinėje klasėje, paieška persikelia į pirmines klases ir pan.' Tai yra paieškos pagal gylį pavyzdys.

Jis vaidina esminį vaidmenį daugialypio paveldėjimo atveju, kai tą patį metodą galima rasti keliose superklasėse.

Norėdami tai geriau suprasti, pažiūrėkime, kaip galime jį panaudoti.

Pavyzdys -

 class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname()) 

Išvestis:

 I am a class C 

Paaiškinimas -

Aukščiau pateiktame kode yra daugybinis paveldėjimas. Mes apibrėžėme tris klases, vadinamas A, B ir C, ir šios klasės turi tą patį pavadinimo metodą Mano vardas(). Sukūrėme objekto klasę C. Objektas iškvietė C klasę, o ne klasę, o C klasė paveldėjo A klasės metodą.

Aukščiau pateiktame kode yra tokia tvarka B klasė -> A klasė. Ši technika žinoma kaip MRO (metodo sprendimo tvarka).

buliai vs jautis

Supraskime kitą daugialypio paveldėjimo pavyzdį.

Pavyzdys -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname() 

Išvestis:

 I am a class B 

Paaiškinimas -

Aukščiau pateiktame kode sukūrėme kitą D klasę, neapibrėždami klasės atributų, kurie paveldėjo B ir C klases. Kai pasinaudojome metodu Mano vardas(), jis eina į D klasę ir ieško Mano vardas( ) funkcija. Tačiau D klasė neturi jokios deklaracijos. Taigi paieška perkeliama į B klasę, gauna Mano vardas() funkcija ir grąžina rezultatą. Paieška vyks taip.

 Class D -> Class B -> Class C -> Class A 

Jei B klasė neturėtų metodo, ji iškvies C klasės metodą.

Čia siūlome pašalinti B klasės metodą ir patikrinti, kas atsitiks. Tai darydami jūs suprasite, kaip veikia metodo skyra.

Seno ir naujo stiliaus tvarka

Senesnėje Python versijoje (2.1) galime naudoti tik senąsias klases, bet Python (2.2 ir tęsti), galime naudoti naujas klases. Pagal numatytuosius nustatymus Python 3 turi originalias (naujas) klases. Naujosios stiliaus klasės pirmasis tėvas paveldi iš Python šakninės „objektų“ klasės. Pažiūrėkime tokį pavyzdį -

Pavyzdys -

 # Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass 

Abiejų klasių deklaravimo stilius skiriasi. Taikant metodo skiriamąją gebą, senojo stiliaus klasės vadovaujasi algoritmu „gylis pirmas iš kairės į dešinę“ (DLR), o naujos stiliaus klasės naudoja C3 linijavimo algoritmą, atlikdamos daugybinį paveldėjimą.

DLR algoritmas

„Python“ sukuria klasių sąrašą, įgyvendindamas daugialypį paveldėjimą tarp klasių. Šis sąrašas naudojamas nustatyti, kuris metodas turi būti vadinamas, kurį iškviečia egzemplioriai.

Galime manyti, kad dirbame pagal pavadinimą, nes metodo skyra pirmiausia ieškos gylio, o tada eis iš kairės į dešinę. Žemiau pateikiamas pavyzdys.

paslėptos programos

Pavyzdys -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

Pirma, algoritmas egzempliorių klasėje ieškos iškviesto metodo. Jei nerasta, patenka į pirmuosius tėvus, jei taip pat nerasta. Ji pažvelgs į tėvų tėvus. Tai tęsis iki klasių paveldėjimo pabaigos.

Aukščiau pateiktame pavyzdyje metodo sprendimo tvarka bus tokia:

 class D -> class B -> class A -> class C -> class A 

Tačiau A negali būti du kartus, todėl

 class D -> class B -> class A -> class C -> 

Šis algoritmas parodo keistą elgesį tuo metu. Pažiūrėkime žemiau pateiktą pavyzdį.

Pavyzdys -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

Pagal DLR algoritmą eilės tvarka bus E, C, D, B, A. C klasėje vyksta A ir B klasių mainai, o tai labai dviprasmiška. Tai reiškia, kad algoritmas neišsaugo monotoniškumo savybės.

Samuele Perdoni buvo pirmasis asmuo, kuris atrado MRO algoritmų neatitikimą.

C3 Linearizacijos algoritmas

C3 Linearization Algorithm yra geresnė DLR algoritmo versija, nes pašalina nenuoseklumą. Šis algoritmas turi tam tikrų apribojimų, kurie pateikiami toliau.

  • Vaikai turi būti pirmesni už savo tėvus.
  • Jei tam tikra klasė paveldi iš vienos ar kelių klasių, jos išsaugomos tokia tvarka, kokia nurodyta pagrindinės klasės eilėje.

C3 linijavimo algoritmo taisyklės

  • Metodo sprendimo eilės struktūrą apibrėžia paveldėjimo grafikas.
  • Vartotojas turi apsilankyti super klasėje tik po to, kai aplanko vietinių klasių metodus.
  • Išsaugokite monotoniškumą

Method Resolution klasės metodas

„Python“ siūlo du būdus, kaip gauti klasės metodo skyros tvarką – __mro__ atributas arba mro () metodas. Šių metodų pagalba galime parodyti metodų, kuriais jie yra išspręsti, tvarką.

Supraskime šį pavyzdį.

Pavyzdys -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro()) 

Išvestis:

 (, , , , ) [, , ] 

Kaip matome aukščiau pateiktoje išvestyje, gauname metodo raiškos eilės tvarką. Tokiu būdu C3 linijavimo algoritmas veikia daugkartiniam paveldėjimui.