15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

definiu a ordem de solução de métodos (Method Resolution Order – MRO). A

MRO padroniza a ordem em que as superclasses são inicializadas (e.g., por

exemplo, mais profundas primeiro, da esquerda para a direita). Ela também

assegura que superclasses envolvidas em arquiteturas losangulares sejam

executadas apenas uma vez.

No exemplo a seguir, outra hierarquia de classes losangular foi criada, mas desta

vez usando super (no estilo do Python 2) para inicializar a classe ancestral:

# Python 2

class TimesFiveCorrect(MyBaseClass):

def __init__(self, value):

super(TimesFiveCorrect, self).__init__(value)

self.value *= 5

class PlusTwoCorrect(MyBaseClass):

def __init__(self, value):

super(PlusTwoCorrect, self).__init__(value)

self.value += 2

Agora a parte superior do losango, a função MyBaseClass.__init__, só é

executada uma única vez. As outras classes-mãe são executadas na ordem

especificada pelo comando class.

# Python 2

class GoodWay(TimesFiveCorrect, PlusTwoCorrect):

def __init__(self, value):

super(GoodWay, self).__init__(value)

foo = GoodWay(5)

print 'Should be 5 * (5 + 2) = 35 and is', foo.value

>>>

Should be 5 * (5 + 2) = 35 and is 35

A ordem pode parecer invertida à primeira vista. TimesFiveCorrect.__init__ não

deveria ser a primeira a executar? O resultado não deveria ser (5 * 5) + 2 = 27?

A resposta é não. Essa ordem obedece ao que a MRO definiu para esta classe. A

ordenação pela MRO está disponível em um método da classe chamado mro.

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!