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.

Para que seja possível, é necessário acessar self._data a partir do método

__getattribute__. Contudo, se tentarmos fazer isso na vida real, o Python se

recusará a fazê-lo recursivamente, até que atinja o limite de sua pilha. Nesse

momento, o programa será interrompido com um erro.

data = BrokenDictionaryDB({'foo': 3})

data.foo

>>>

Called __getattribute__(foo)

Called __getattribute__(_data)

Called __getattribute__(_data)

...

Traceback ...

RuntimeError: maximum recursion depth exceeded

O problema é que __getattribute__ acessa self._data, o que causa uma nova

execução de __getattribute__, que acessa self._data e assim por diante, numa

recursão circular. A solução é usar o método super().__getattribute__ em sua

instância para obter os valores do dicionário de atributos. Dessa forma, evitamos

recursão.

class DictionaryDB(object):

def __init__(self, data):

self._data = data

def __getattribute__(self, name):

data_dict = super().__getattribute__('_data')

return data_dict[name]

De forma semelhante, os métodos __setattr__ que modifiquem atributos em um

objeto devem usar super().__setattr__.

Lembre-se

• Use __getattr__ e __setattr__ para carregar e salvar atributos de forma

preguiçosa (lazy) em um objeto.

• Entenda que __getattr__ só é chamado uma única vez quando um atributo

inexistente é acessado, enquanto __getattribute__ é chamado toda vez que

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!