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.

No exemplo de código a seguir, acessamos uma propriedade chamada foo que

não existe no objeto. Isso faz com que o Python chame o método __getattr__

definido na classe LazyDB, que altera __dict__, o dicionário da instância:

data = LazyDB()

print('Before:', data.__dict__)

print('foo: ', data.foo)

print('After: ', data.__dict__)

>>>

Before: {'exists': 5}

foo: Value for foo

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

No código a seguir, adicionamos um registro de eventos (log) à classe LazyDB

para saber em que momento __getattr__ é chamada. Observe que usamos

super().__getattr__() para obter o valor real da propriedade e assim evitar

recursão infinita.

class LoggingLazyDB(LazyDB):

def __getattr__(self, name):

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

return super().__getattr__(name)

data = LoggingLazyDB()

print('exists:', data.exists)

print('foo: ', data.foo)

print('foo: ', data.foo)

>>>

exists: 5

Called __getattr__(foo)

foo: Value for foo

foo: Value for foo

O atributo exists está presente no dicionário da instância, portanto __getattr__

nunca é chamado. O atributo foo não está no dicionário, portanto __getattr__ é

chamado pela primeira vez. Porém, a chamada a __getattr__ para foo chama

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!