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.

que queremos rastrear.

class CountMissing(object):

def __init__(self):

self.added = 0

def missing(self):

self.added += 1

return 0

Em outras linguagens, seria de se esperar que a classe defaultdict agora tivesse

que ser modificada para acomodar a interface de CountMissing. Em Python,

todavia, graças às suas funções de primeira classe, é possível referenciar o

método CountMissing.missing diretamente em um objeto e passá-lo à classe

defaultdict como gancho de valor default. É trivial fazer com que o método

satisfaça à função de interface.

counter = CountMissing()

result = defaultdict(counter.missing, current) # Referencia o método

for key, amount in increments:

result[key] += amount

assert counter.added == 2

Usar uma classe auxiliar como essa para oferecer o comportamento de um

closure que guarda seu estado é mais limpo e organizado que a função

increment_with_report descrita anteriormente. Entretanto, vista isoladamente,

não fica muito óbvio qual a razão de ser da classe CountMissing. Quem constrói

um objeto CountMissing? Quem chama o método missing? A classe vai precisar

que outros métodos públicos sejam adicionados no futuro? Até que se veja como

ela é usada pelo defaultdict, a classe é um mistério.

Para esclarecer a situação, o Python permite que as classes definam o método

especial __call__. Esse método permite que um objeto seja chamado da mesma

maneira que uma função. Com isso, a função nativa callable retorna True para

qualquer instância dessa classe.

class BetterCountMissing(object):

def __init__(self):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!