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.

result = mapreduce(LineCountWorker, PathInputData, config)

Agora podemos escrever outras classes GenericInputData GenericWorker à

vontade e não será mais preciso reescrever nenhum código do programa

principal.

Lembre-se

• O Python suporta apenas um construtor por classe, o método __init__.

• Use @classmethod para definir construtores alternativos para suas classes.

• Use polimorfismo de método de classe para implementar uma maneira

genérica de construir e conectar subclasses concretas.

Item 25: Inicialize classes ancestrais com super

A velha maneira de inicializar uma classe-mãe a partir de uma classe-filha era

chamar diretamente o método __init__ da classe-mãe com a instância-filha.

class MyBaseClass(object):

def __init__(self, value):

self.value = value

class MyChildClass(MyBaseClass):

def __init__(self):

MyBaseClass.__init__(self, 5)

Funciona para hierarquias simples, mas começa a apresentar problemas em

muitos casos.

Se sua classe for afetada por múltiplas heranças (algo a ser evitado, aliás!

Consulte o Item 26: “Use heranças múltiplas apenas para classes utilitárias mixin”),

chamar o método __init__ da superclasse diretamente pode causar

comportamento imprevisível.

Um dos problemas com isso é que a ordem de chamada a __init__ não está

especificada em todas as subclasses. Por exemplo, o código a seguir define duas

classes-mãe que operam no campo value da instância:

class TimesTwo(object):

def __init__(self):

self.value *= 2

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!