Sobes.tech
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'>)