15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

class Implicit(MyBaseClass):

def __init__(self, value):

super().__init__(value * 2)

assert Explicit(10).value == Implicit(10).value

O código anterior funciona porque o Python 3 permite referenciar de forma

confiável a classe atual em métodos usando a variável __class__. Isso não

funciona no Python 2 porque __class__ não é definida. Poderíamos pensar que o

emprego de self.__class__ como argumento de super funcionaria, mas, na

verdade, o artifício geraria um erro por conta da maneira com que super foi

implementada em Python 2.

Lembre-se

• O método-padrão de solução de ordem no Python (MRO) resolve alguns

problemas na inicialização de superclasses, seja em sua ordenação ou nos

casos de herança losangular.

• Sempre use a função nativa super para inicializar classes ancestrais.

Item 26: Use heranças múltiplas apenas para classes

utilitárias mix-in

O Python é uma linguagem orientada a objetos com recursos nativos para tornar

palatáveis as situações de múltipla herança (consulte o Item 25: “Inicialize

classes ancestrais com super”). Entretanto, o melhor a se fazer é evitar o

emprego de herança múltipla.

Se você deseja a conveniência e o encapsulamento que advém da múltipla

herança, considere em seu lugar o uso de um mix-in, uma minúscula classe que

define unicamente um conjunto de métodos adicionais que uma classe deve

oferecer. As classes mix-in não definem seus próprios atributos de instância nem

precisam que seu construtor __init__ seja chamado.

Escrever um mix-in é fácil porque em Python é trivial inspecionar o estado atual

de qualquer objeto, independentemente de seu tipo. A inspeção dinâmica permite

escrever funcionalidade genérica uma única vez em um mix-in, que pode ser

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!