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.

um atributo for acessado.

• Evite recursão infinita em __getattribute__ e __setattr__ empregando

métodos de super() (ou seja, da classe object) para acessar atributos de

instância diretamente.

Item 33: Valide subclasses com metaclasses

Uma das aplicações mais simples das metaclasses é conferir se uma classe foi

definida corretamente. Ao construir uma hierarquia complexa de classes,

podemos querer obrigar o uso de um determinado estilo, ou tornar mandatória a

sobreposição de métodos, ou ainda garantir relacionamentos rigorosos entre os

atributos de classe. As metaclasses permitem esses casos de uso ao oferecer uma

maneira confiável para executar o código de validação a cada vez que uma nova

subclasse for definida.

Na maioria das vezes, o código de validação de uma classe é executado no

método __init__, no momento em que um objeto dessa classe está sendo

construído (consulte o Item 28: “Herde da classe collections.abc para obter tipos

de contêiner personalizados” para ver um exemplo). O uso de metaclasses para

validação pode levantar exceções mais cedo no tempo de vida do programa.

Antes de saber como definir metaclasses para validar subclasses, é importante

entender a ação da metaclasse para objetos comuns. Uma metaclasse é definida a

partir de um tipo de dado. No caso mais comum, uma metaclasse recebe o

conteúdo de comandos class em seu método __new__. No trecho de código a

seguir, podemos modificar a informação de classe antes que o tipo seja

realmente construído:

class Meta(type):

def __new__(meta, name, bases, class_dict):

print((meta, name, bases, class_dict))

return type.__new__(meta, name, bases, class_dict)

class MyClass(object, metaclass=Meta):

stuff = 123

def foo(self):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!