python - 程序運(yùn)行會出現(xiàn)錯誤
問題描述
class Person(object): def __init__(self,name):self.name = nameclass Teacher(Person): def __init__(self,score):self.__score = scoreclass 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 = 95print s1
在運(yùn)行這個程序時,只有當(dāng)score是私有變量的時候才能正常運(yùn)行,是property的某些特性嗎,還是什么?如果只設(shè)置為self.score = score,就會出現(xiàn)‘maximum recursion depth exceeded while calling a Python object’的錯誤,求大神解答
問題解答
回答1:會產(chǎn)生這個困惑的原因是對python的getter裝飾器和setter裝飾器不夠熟悉
當(dāng)你聲明了對score屬性的setter裝飾器之后, 實際上對這個score進(jìn)行賦值就是調(diào)用這個setter裝飾器綁定的方法
所以你的setter要訪問的成員變量不能和setter方法同名, 不然就相當(dāng)于一個無盡的迭代:
self.score(self.score(self.score(self.score(self.score........ 無盡的迭代,
當(dāng)然會報超過最大迭代深度的錯誤了
相關(guān)文章:
1. 一個走錯路的23歲傻小子的提問2. python - 如何使用pykafka consumer進(jìn)行數(shù)據(jù)處理并保存?3. javascript - SuperSlide.js火狐不兼容怎么回事呢4. java - 創(chuàng)建maven項目失敗了 求解決方法5. android - 安卓activity無法填充屏幕6. java-se - 正在學(xué)習(xí)Java SE,為什么感覺學(xué)習(xí)Java就是在學(xué)習(xí)一些API。7. 運(yùn)行python程序時出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯誤?8. python - django 里自定義的 login 方法,如何使用 login_required()9. java - 安卓電視盒子取得了root權(quán)限但是不能安裝第三方應(yīng)用,請問該怎么辦?10. 一個mysql聯(lián)表查詢的問題
