15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Quando uma propriedade é recuperada...

print(exam.writing_grade)

... o Python interpretará da seguinte maneira:

print(Exam.__dict__['writing_grade'].__get__(exam, Exam))

O que leva a esse comportamento é o método __getattribute__ do object

(consulte o Item 32: “Use __getattr__, __getattribute__ e __setattr__ para

atributos preguiçosos”). Resumidamente, quando uma instância de Exam não

possuir um atributo chamado writing_grade, o Python usará o atributo da classe

Exam em seu lugar. Se esse atributo de classe for um objeto que possua os

métodos __get__ e __set__, o Python considerará que o programador deseja

seguir o protocolo do descritor.

Agora que conhecemos esse comportamento, bem como a maneira como o

decorador @property foi usado para implementar a validação da nota na classe

Homework, o trecho de código a seguir mostra uma primeira tentativa bastante

razoável de implementar o descritor Grade.

class Grade(object):

def __init__(self):

self._value = 0

def __get__(self, instance, instance_type):

return self._value

def __set__(self, instance, value):

if not (0 <= value <= 100):

raise ValueError('Grade must be between 0 and 100')

self._value = value

Infelizmente, o código está completamente errado e o comportamento resultante

será errático e imprevisível. Se acessarmos mais de um atributo em uma mesma

instância de Exam, tudo funciona como esperado.

first_exam = Exam()

first_exam.writing_grade = 82

first_exam.science_grade = 99

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!