ディスクリプタの使い方

Effective Python から item31

import weakref
class Grade(object):

	def __init__(self):
		self._values = weakref.WeakKeyDictionary()
		print(self._values)
	def __get__(self, instance, instance_type):
		if instance is None: return self
		print(instance, instance_type)
		return self._values.get(instance, 0)

	def __set__(self, instance, value):
		if not (0 <= value <= 100):
			raise ValueError('Grade must be between 0 and 100')

		self._values[instance] = value

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_exam', first_exam.writing_grade)
print('Second_exam', second_exam.writing_grade)
結果
<WeakKeyDictionary at 4435535520>
<WeakKeyDictionary at 4436028160>
<WeakKeyDictionary at 4436028328>
<__main__.Exam object at 0x108686c18> <class '__main__.Exam'>
First_exam 82
<__main__.Exam object at 0x108686c50> <class '__main__.Exam'>
Second_exam 75

weakref.WeakKeyDictionary() はディクショナリ{}と考えてオッケー
メモリーリークを起こさないために使用