from weakref import WeakKeyDictionary
class Score():
""" score should in [0,100] """
def __init__(self):
self.score = WeakKeyDictionary()
#self.score = {}
def __get__(self, instance, owner):
return self.score[instance]
def __set__(self, instance, value):
if 0 <= value <= 100:
self.score[instance] = value
else:
raise ValueError("score not in [0,100]")
class Student():
# 托管属性定义在类级别上
score1 = Score()
score2 = Score()
score3 = Score()
def __init__(self, stuid, name, score1, score2, score3):
self.stuid = stuid
self.name = name
self.score1 = score1
self.score2 = score2
self.score3 = score3
def returnMe(self):
return "%s, %s, %i, %i, %i" % (
self.stuid,
self.name,
self.score1,
self.score2,
self.score3)
stu = Student("20101120", "malong", 67, 77, 88)
print(stu.returnMe())
stu.score1 = -23
上面使用了弱引用的字典,因为每个属性只在描述符对象中才会被用上,为了保证Student对象被销毁的时候能释放这些资源,所以采用弱引用,避免出现内存泄漏