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 PythonMultiDerived-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 PythonMetodupplösning i Python
Varje klass i Python kommer från object
klassen. 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 object
klassen.
# 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 MultiDerived
klass sökordn är ( MultiDerived
, Base1
, Base2
, object
). Denna ordning kallas också linjärisering av MultiDerived
klass 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.