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.

aplicada em muitas outras classes. Os mix-ins são compostos e montados em

camadas de forma a minimizar código repetitivo e maximizar sua reutilização.

Por exemplo, digamos que se queira implementar um recurso para converter um

objeto qualquer do Python que tenha uma representação em memória em um

dicionário pronto para ser serializado. Por que não escrever essa funcionalidade

de forma genérica para que possa ser usada em todas as classes?

No exemplo a seguir, definimos um mix-in de exemplo que obtém esse resultado

com um novo método público que pode ser inserido em qualquer classe,

bastando que essa classe herde do mix-in esse método.

class ToDictMixin(object):

def to_dict(self):

return self._traverse_dict(self.__dict__)

Os detalhes de implementação são simples e diretos e se apoiam em um acesso

dinâmico a atributos usando hasattr, inspeção dinâmica de tipos com isinstance e

acesso ao dicionário da instância, __dict__.

def _traverse_dict(self, instance_dict):

output = {}

for key, value in instance_dict.items():

output[key] = self._traverse(key, value)

return output

def _traverse(self, key, value):

if isinstance(value, ToDictMixin):

return value.to_dict()

elif isinstance(value, dict):

return self._traverse_dict(value)

elif isinstance(value, list):

return [self._traverse(key, i) for i in value]

elif hasattr(value, '__dict__'):

return self._traverse_dict(value.__dict__)

else:

return value

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!