Maison > Questions et réponses > le corps du texte
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
Lors de l'exécution de ce programme, il ne peut s'exécuter normalement que lorsque le score est une variable privée. S'agit-il d'une fonctionnalité de la propriété, ou quoi ? Si vous le définissez uniquement sur self.score = score, l'erreur « profondeur de récursion maximale dépassée lors de l'appel d'un objet Python » apparaîtra. Veuillez me donner une réponse
.PHP中文网2017-06-22 11:54:35
La raison de cette confusion est que vous n'êtes pas assez familier avec le décorateur getter et le décorateur setter de Python
Après avoir déclaré le décorateur setter pour l'attribut score, l'attribution du score consiste en fait à appeler la méthode liée par le décorateur setter
Donc la variable membre à laquelle votre setter veut accéder ne peut pas avoir le même nom que la méthode setter, sinon cela équivaudra à une itération sans fin :
self.score(self.score(self.score(self.score(self.score........ 无尽的迭代,
Bien sûr, une erreur de dépassement de la profondeur maximale d'itération sera signalée