Python Multiple Arv: Hvad er det, og hvordan bruges det?

I denne vejledning lærer du om flere arv i Python, og hvordan du bruger det i dit program. Du lærer også om arv på flere niveauer og metodeopløsningsrækkefølgen.

Python flere arv

En klasse kan afledes fra mere end en basisklasse i Python, svarende til C ++. Dette kaldes flere arv.

I flere arv nedarves funktionerne i alle basisklasser i den afledte klasse. Syntaksen for flere arv svarer til en enkelt arv.

Eksempel

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

Her stammer MultiDerived-klassen fra Base1- og Base2-klasser.

Flere arv i Python

MultiDerived-klassen arver fra både Base1- og Base2-klasser.

Python arvelighed på flere niveauer

Vi kan også arve fra en afledt klasse. Dette kaldes arv på flere niveauer. Det kan være af enhver dybde i Python.

I arv på flere niveauer nedarves funktionerne i baseklassen og den afledte klasse i den nye afledte klasse.

Et eksempel med tilsvarende visualisering er givet nedenfor.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

Her er Derived1-klassen afledt af Base-klassen, og Derived2-klassen er afledt af Derived1-klassen.

Multilevel Arv i Python

Metodeopløsningsrækkefølge i Python

Hver klasse i Python stammer fra objectklassen. Det er den mest basistype i Python.

Så teknisk set er alle andre klasser, enten indbyggede eller brugerdefinerede, afledte klasser, og alle objekter er forekomster af objectklassen.

 # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))

I scenariet med flere arv søges der efter en bestemt attribut først i den aktuelle klasse. Hvis den ikke findes, fortsætter søgningen i overordnede klasser på dybde-første, venstre-højre måde uden at søge den samme klasse to gange.

Så i ovenstående eksempel på MultiDerivedklassen søgningen ordre er ( MultiDerived, Base1, Base2, object). Denne rækkefølge kaldes også linearisering af MultiDerivedklasse, og det regelsæt, der bruges til at finde denne rækkefølge, kaldes Method Resolution Order (MRO) .

MRO skal forhindre lokal rækkefølge og også give monotonicitet. Det sikrer, at en klasse altid vises for sine forældre. I tilfælde af flere forældre er rækkefølgen den samme som tupler i basisklasser.

MRO i en klasse kan ses som __mro__attributten eller mro()metoden. Førstnævnte returnerer en tuple, mens sidstnævnte returnerer en liste.

 >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )

Her er et lidt mere komplekst eksempel på flere arv og dets visualisering sammen med MRO.

Visualisering af flere arv i Python
 # Demonstration of MRO class X: pass class Y: pass class Z: pass class A(X, Y): pass class B(Y, Z): pass class M(B, A, Z): pass # Output: # (, , # , , # , , # ) print(M.mro())

Produktion

 (,,,,,,,)

For at kende den faktiske algoritme for, hvordan MRO beregnes, skal du besøge Diskussion om MRO.

Interessante artikler...