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.

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.

Metodeopløsningsrækkefølge i Python
Hver klasse i Python stammer fra object
klassen. 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 object
klassen.
# 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å MultiDerived
klassen søgningen ordre er ( MultiDerived
, Base1
, Base2
, object
). Denne rækkefølge kaldes også linearisering af MultiDerived
klasse, 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.

# 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.