使用描述符来改写需要复用的@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

 

posted @ 2017-08-08 10:28  Vincen_shen  阅读(178)  评论(0)    收藏  举报