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.

print('foo exists: ', hasattr(data, 'foo'))

print('After: ', data.__dict__)

print('foo exists: ', hasattr(data, 'foo'))

>>>

Before: {'exists': 5}

Called __getattr__(foo)

foo exists: True

After: {'exists': 5, 'foo': 'Value for foo'}

foo exists: True

No exemplo acima, __getattr__ só é chamado uma vez. Em contraste, as classes

que implementam __getattribute__ chamam esse método todas as vezes que

hasattr ou getattr são executadas contra um objeto.

data = ValidatingDB()

print('foo exists: ', hasattr(data, 'foo'))

print('foo exists: ', hasattr(data, 'foo'))

>>>

Called __getattribute__(foo)

foo exists: True

Called __getattribute__(foo)

foo exists: True

Digamos que se queira agora forçar o envio de dados de forma preguiçosa para o

banco de dados. O banco deve gravar esses dados sempre que algum valor for

atribuído ao objeto em Python. Podemos fazê-lo com __setattr__, um gancho de

linguagem semelhante aos anteriores, que permite interceptar atribuições

arbitrárias a atributos. Em vez de ler um atributo com os métodos __getattr__ e

__getattribute__, não há necessidade de dois métodos separados. O método

__setattr__ é sempre chamado toda vez que é atribuído um valor a um atributo

em uma instância (seja diretamente ou por meio da função nativa setattr).

class SavingDB(object):

def __setattr__(self, name, value):

# Grava alguns dados no banco de dados de log

# ...

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!