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.

Lembre-se

• Reutilize o comportamento e a validação dos métodos de @property

definindo suas próprias classes descritoras.

• Use WeakKeyDictionary para garantir que suas classes descritoras não

causem vazamentos de memória.

• Não se demore muito tentando entender como o __getattribute__ usa o

protocolo do descritor para definir (setter) ou recuperar (getter) os atributos.

Item 32: Use __getattr__, __getattribute__ e

__setattr__ para atributos preguiçosos

Os ganchos da linguagem Python facilitam desenvolver código genérico para

“colar” todas as partes de um sistema. Por exemplo, digamos que se queira

representar as linhas de seu banco de dados como objetos do Python. O banco

possui um schema rodando. O código em seu sistema que usa objetos

correspondes àquelas linhas deve também conhecer como o banco está

organizado. Entretanto, em Python, o código que conecta os objetos ao banco de

dados não precisa conhecer o schema das linhas. Pelo contrário, ele pode ser

genérico.

Como isso é possível? Atributos comuns de instância, métodos @property e

descritores não podem ser usados dessa maneira porque precisam ser definidos

de antemão. O Python torna possível esse comportamento dinâmico por meio do

método especial __getattr__. Quando uma classe define __getattr__, esse

método é chamado toda vez que um atributo não for encontrado no dicionário da

instância do objeto.

class LazyDB(object):

def __init__(self):

self.exists = 5

def __getattr__(self, name):

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!