Senior
Mi a különbség az MRO2 és az MRO3 között?
sobes.tech MI
Válasz az MI-től
MRO2 (módszermegoldási sorrend klasszikus) régi, "klasszikus" osztályokban használatos, amelyek nem örökölnek kifejezetten az object-től. Az öröklési hierarchiában mélységi keresésen alapul.
A MRO3 (C3 lineárizációs algoritmus) olyan osztályokban használatos, amelyek az object-től örökölnek (ami a Python 3-ban az alapértelmezett, és Python 2.2+ esetén, ha a __future__-ből importáljuk a division-t). Garantálja a monoton sorrendet, és megakadályozza az olyan több öröklésből adódó problémákat, mint például a gyémánt probléma.
Fő különbségek:
- Algoritmus: MRO2 - egyszerű DFS; MRO3 - C3 lineárizáció.
- Öröklés az
object-től: MRO2 - nem kötelező vagy nem szükséges; MRO3 - minden új stílusú osztálynál használatos. - Garanciák: MRO2 nem mindig garantálja a monotonitást, és kiszámíthatatlan viselkedést eredményezhet több öröklés esetén; MRO3 garantálja a monotonitást és a kiszámítható sorrendet.
# MRO2 példa
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
# Python 2-ben `object` öröklése nélkül:
# D -> B -> A -> C -> A
# MRO3 példa (az `object`-től örököl)
class A: # Python 3-ban automatikusan örököl az `object`-től
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
# Python 3-ban (vagy Python 2-ben `object`-től örökölve):
# D -> B -> C -> A -> object
Az MRO-t az __mro__ attribútummal lehet megtekinteni:
class A(object):
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__)
# Kimenet Python 3-ban: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)