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.

from pprint import pprint

pprint(GoodWay.mro())

>>>

[<class '__main__.GoodWay'>,

<class '__main__.TimesFiveCorrect'>,

<class '__main__.PlusTwoCorrect'>,

<class '__main__.MyBaseClass'>,

<class 'object'>]

Quando eu chamo GoodWay(5), este por sua vez chama

TimesFiveCorrect.__init__, que chama PlusTwoCorrect.__init__, que chama

MyBaseClass.__init__. Uma vez que as chamadas atinjam o topo do losango,

todos os métodos de inicialização executam o que foram programados para fazer

na ordem inversa com que suas funções __init__ foram chamadas,

MyBaseClass.__init__ atribui a value o valor 5. PlusTwoCorrect.__init__ soma

2 para fazer com que value seja igual a 7. TimesFiveCorrect.__init__ multiplicao

por 5 para que value assuma o valor 35.

A função nativa super funciona muito bem, mas tem dois problemas bastante

incômodos no Python 2:

• Sua sintaxe é um tanto prolixa. É preciso especificar a classe em que se está,

o objeto self, o nome do método (normalmente __init__) e todos os

argumentos. Essa construção pode ser confusa para programadores iniciantes

em Python.

• É preciso especificar a classe atual pelo nome ao chamar super. Se por algum

motivo for necessário mudar o nome da classe – algo extremamente comum

quando se está otimizando a hierarquia de classes – também se faz necessário

atualizar todas as chamadas a super.

Felizmente, o Python 3 acaba com esses inconvenientes, pois as chamadas a

super sem nenhum argumento equivalem a chamar super com __class__ e self

automaticamente especificados. No Python 3, você deve sempre usar super

porque é limpo, conciso e sempre faz a coisa certa.

class Explicit(MyBaseClass):

def __init__(self, value):

super(__class__, self).__init__(value * 2)

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!