Esclarecendo MRO em classes de novo estilo
Ao contrário do antigo classes de estilo novo, as classes de novo estilo examinam suas classes base para estabelecer uma Ordem de Resolução de Método (MRO). Esta ordem determina a sequência na qual os métodos são pesquisados quando um método é chamado em um objeto.
Resolvendo conflitos de herança com MRO
A principal distinção entre MRO em novos classes de estilo e estilo antigo surgem quando a mesma classe ancestral aparece várias vezes na hierarquia de herança. Por exemplo, considere o seguinte caso de herança de diamante:
class Base1(object):
def amethod(self):
print("Base1")
class Base2(Base1):
pass
class Base3(object):
def amethod(self):
print("Base3")
class Derived(Base2, Base3):
pass
Legacy-Style MRO:
Em classes de estilo legado, a ordem de resolução seria D - B - A - C - A. Aqui, ao invocar D .amethod(), a definição em A é encontrada primeiro e substitui a definição em C.
New-Style MRO:
Para classes de novo estilo, o MRO é o seguinte:
D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
Observe que A aparece apenas uma vez nesta ordem, depois de todas as suas subclasses. Isso garante que as substituições em subclasses, como a substituição de um método em C, tenham precedência.
Compreendendo a importância do MRO
O MRO nas classes de novo estilo resolve conflitos de herança sensatamente, permitindo que as substituições funcionem corretamente. Também evita situações em que múltiplas definições do mesmo método aparecem na ordem de resolução, levando a um comportamento ambíguo. Ao compreender e utilizar o MRO de forma eficaz, os desenvolvedores podem projetar hierarquias de herança robustas e sustentáveis em Python.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3