class Person(object):
def __init__(self,name):
self.name = name
class Teacher(Person):
def __init__(self,score):
self.__score = score
class Student(Teacher,Person):
def __init__(self,name,score):
Person.__init__(self,name)
super(Student,self).__init__(score)
@property
def score(self):
return self.__score
@score.setter
def score(self,score):
if score<0 or score >100:
raise ValueError('invalid score')
self.__score = score
def __str__(self):
return 'Student:%s,%d' %(self.name,self.score)
s1 = Student('Jack',89)
s1.score = 95
print s1
Wenn dieses Programm ausgeführt wird, kann es nur dann normal ausgeführt werden, wenn es sich bei der Punktzahl um eine private Variable handelt, oder was? Wenn Sie es nur auf self.score = Score setzen, wird die Fehlermeldung „Maximale Rekursionstiefe beim Aufruf eines Python-Objekts überschritten“ angezeigt. Bitte geben Sie mir eine Antwort
会产生这个困惑的原因是对python的getter装饰器和setter装饰器不够熟悉
当你声明了对score属性的setter装饰器之后, 实际上对这个score进行赋值就是调用这个setter装饰器绑定的方法
所以你的setter要访问的成员变量不能和setter方法同名, 不然就相当于一个无尽的迭代:
当然会报超过最大迭代深度的错误了