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.

de código-padrão (os chamados boilerplates 2 ) escritos para @property e

_check_grade.

A melhor maneira de resolver esse tipo de problema em Python é usar um

descritor, ou descriptor. O protocolo do descritor define como os acessos a

atributos são interpretados pela linguagem. Uma classe descritora pode

implementar métodos __get__ e __set__ que nos permitem reutilizar o

comportamento da validação de notas sem precisar escrever nenhum clichê. Para

esse propósito, os descritores são também melhores que os mix-ins (consulte o

Item 26: “Use heranças múltiplas apenas para classes utilitárias mix-in”), porque

elas permitem reutilizar a mesma lógica para vários atributos diferentes em uma

mesma classe.

No exemplo de código a seguir, definimos uma nova classe chamada Exam com

atributos de classe que são, na verdade, instâncias de Grade. A classe Grade

implementa o protocolo do descritor. Antes de entender como a classe Grade

funciona, é importante entender o que o Python fará quando o código acessa um

desses atributos de descritor em uma instância de Exam.

class Grade(object):

def __get__(*args, **kwargs):

# ...

def __set__(*args, **kwargs):

# ...

class Exam(object):

# Atributos de classe

math_grade = Grade()

writing_grade = Grade()

science_grade = Grade()

Quando é atribuído um valor à propriedade...

exam = Exam()

exam.writing_grade = 40

...o Python na verdade interpretará a atribuição da seguinte maneira:

Exam.__dict__['writing_grade'].__set__(exam, 40)

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!