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.

internamente o método setattr, que preenche o valor de foo no dicionário da

instância. É por isso que, na segunda vez que foo é acessado, __getattr__ não é

chamada.

Este comportamento é especialmente útil para casos de uso como o acesso

preguiçoso a dados que não possuam schema. O método __getattr__ roda uma

primeira vez para fazer todo o trabalho sujo de carregar a propriedade. Todos os

acessos subsequentes recuperam o valor agora existente.

Digamos que também seja desejável implementar transações neste sistema de

banco de dados. Na próxima vez que o usuário acessar uma propriedade,

queremos saber se a linha correspondente no banco de dados anda é válida e se

as transações ainda estão abertas. O gancho de __getattr__ não permite que essa

operação seja consumada de forma confiável porque usa o dicionário da

instância do objeto como um atalho para os atributos existentes.

Para que esse caso de uso possa ser satisfeito, o Python possui outro gancho

chamado __getattribute__. Esse método especial é chamado toda vez que um

atributo é acessado em um objeto, mesmo nos casos em que ele já existe no

dicionário de atributos, o que permite fazer coisas como verificar o estado global

da transação em cada acesso a uma propriedade. No exemplo de código a seguir,

definimos ValidatingDB para incluir uma mensagem no log cada vez que

__getattribute__ for chamado.

class ValidatingDB(object):

def __init__(self):

self.exists = 5

def __getattribute__(self, name):

print('Called __getattribute__(%s)' % name)

try:

return super().__getattribute__(name)

except AttributeError:

value = 'Value for %s' % name

setattr(self, name, value)

return value

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!