使用描述符来改写需要复用的@property方法
class Grade(object): def __init__(self): self._value = 0 def __get__(self, instance, owner): return self._value def __set__(self, instance, value): self._value = value class Exam(object): math_grade = Grade()
scicen_grade = Grade()
first_exam = Exam() first_exam.math_grade = 50 second_exam = Exam() second_exam.math_grade = 60 print(first_exam.math_grade) >>>> 60 # 结果出现错误,这是因为当程序定义Exam类时,它会把Grade实例构建好,以后创建Exam实例时就不再构建Grade了。 要解决此问题,需要使用字典来保存每个实例的状态。
第二版:
from weakref import WeakKeyDictionary class Grade(object): def __init__(self): self._value = WeakKeyDictionary() # 防止内存泄露 def __get__(self, instance, owner): if instance is None: return self return self._value.get(instance, None) def __set__(self, instance, value): self._value[instance] = value class Exam(object): math_grade = Grade() first_exam = Exam() first_exam.math_grade = 50 second_exam = Exam() second_exam.math_grade = 60 print(first_exam.math_grade) >>>> 50