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.

print('Writing', first_exam.writing_grade)

print('Science', first_exam.science_grade)

>>>

Writing 82

Science 99

Contudo, se os mesmos atributos forem acessados ao mesmo tempo em

instâncias diferentes de Exam, obteremos um comportamento inesperado.

second_exam = Exam()

second_exam.writing_grade = 75

print('Second', second_exam.writing_grade, 'is right')

print('First ', first_exam.writing_grade, 'is wrong')

>>>

Second 75 is right

First 75 is wrong

O problema é que uma única instância de Grade é compartilhada por todas as

instâncias de Exam no tocante ao atributo de classe writing_grade. A instância

Grade para esses atributos é construída apenas uma vez em todo o tempo de vida

do programa, ou seja, no momento em que a classe Exam é definida e não a cada

vez que uma instância de Exam é criada.

Para resolver o problema, é preciso que a classe Grade mantenha um registro de

seu valor para cada uma das instâncias únicas de Exam. Isso pode ser obtido

armazenando o estado de cada instância em um dicionário.

class Grade(object):

def __init__(self):

self._values = {}

def __get__(self, instance, instance_type):

if instance is None: return self

return self._values.get(instance, 0)

def __set__(self, instance, value):

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

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!