Python Multiple Arv: Vad är det och hur man använder det?

I den här handledningen lär du dig om flera arv i Python och hur du använder det i ditt program. Du lär dig också om arv på flera nivåer och metodupplösningsordningen.

Python Multiple Arv

En klass kan härledas från mer än en basklass i Python, liknande C ++. Detta kallas multipel arv.

I flera arv ärvs funktionerna i alla basklasserna till den härledda klassen. Syntaxen för flera arv liknar enstaka arv.

Exempel

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

Här härrör MultiDerived-klassen från Base1- och Base2-klasserna.

Multipel arv i Python

MultiDerived-klassen ärver från både Base1- och Base2-klasserna.

Python-arv med flera nivåer

Vi kan också ärva från en härledd klass. Detta kallas arv på flera nivåer. Det kan vara av något djup i Python.

I arv med flera nivåer ärvs egenskaper hos basklassen och den härledda klassen till den nya härledda klassen.

Ett exempel med motsvarande visualisering ges nedan.

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

Här härleds klassen Derived1 från basklassen och Derived2-klassen härleds från klassen Derived1.

Multilevel Arv i Python

Metodupplösning i Python

Varje klass i Python kommer från objectklassen. Det är den mest basa typen i Python.

Så tekniskt sett är alla andra klasser, antingen inbyggda eller användardefinierade, härledda klasser och alla objekt är förekomster av objectklassen.

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

I multipelarvsscenariet söks varje specificerat attribut först i den aktuella klassen. Om den inte hittas fortsätter sökningen till föräldraklasser på djupet först, vänster-höger utan att söka i samma klass två gånger.

Så, i exemplet ovan av MultiDerivedklass sökordn är ( MultiDerived, Base1, Base2, object). Denna ordning kallas också linjärisering av MultiDerivedklass och den uppsättning regler som används för att hitta denna ordning kallas Method Resolution Order (MRO) .

MRO måste förhindra lokal företräde och också ge monotonicitet. Det säkerställer att en klass alltid visas inför sina föräldrar. Vid flera föräldrar är ordern densamma som tupler i basklasser.

MRO i en klass kan ses som __mro__attributet eller mro()metoden. Den förra returnerar en tuple medan den senare returnerar en lista.

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

Här är ett lite mer komplext exempel på flera arv och dess visualisering tillsammans med MRO.

Visualisering av flera 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

 (,,,,,,,)

För att veta den faktiska algoritmen för hur MRO beräknas, besök Diskussion om MRO.

Intressanta artiklar...