ディスクリプタの使い方
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() はディクショナリ{}と考えてオッケー
メモリーリークを起こさないために使用