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.

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

self._values[instance] = value

Essa implementação é simples e funciona bem, mas há ainda uma pegadinha:

vazamento de memória. O dicionário _values armazena uma referência a cada

instância de Exam que for passada para o método __set__ em todo o tempo de

vida do programa. Com isso, as instâncias nunca zeram suas referências, o que

impede que o coletor de lixo (garbage collector) do Python faça seu trabalho.

Para remediar a situação, pode-se empregar o módulo nativo weakref do Python,

que oferece uma classe especial chamada WeakKeyDictionary para ser usada em

lugar do dicionário de _values. O comportamento de WeakKeyDictionary é

diferente, ela remove as instâncias de Exam de sua lista de chaves quando o

runtime percebe que está armazenando a última referência restante da instância

no programa. O Python fará ele mesmo o controle dos registros para você e

garantirá que o dicionário _values esteja vazio quando todas as instâncias de

Exam já não estiverem em uso.

class Grade(object):

def __init__(self):

self._values = WeakKeyDictionary()

# ...

Com essa implementação do descritor Grade, tudo funciona como esperado.

class Exam(object):

math_grade = Grade()

writing_grade = Grade()

science_grade = Grade()

first_exam = Exam()

first_exam.writing_grade = 82

second_exam = Exam()

second_exam.writing_grade = 75

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

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

>>>

First 82 is right

Second 75 is right

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!