python中的內建屬性
阿新 • • 發佈:2018-11-19
"teachclass.py"
class Person(object):
pass
python3.5中類的內建屬性和方法
經典類(舊式類),早期如果沒有要繼承的父類,繼承裡空著不寫的類
#py2中⽆繼承⽗類,稱之經典類,py3中已預設繼承object
class Person:
pass
子類沒有實現 __init__ 方法時,預設自動呼叫父類的。 如定義 __init__ 方法時,需自己手動呼叫父類的 __init__ 方法
__getattribute__ 例子:
class Itcast(object): def __init__(self,subject1): self.subject1 = subject1 self.subject2 = 'cpp' #屬性訪問時攔截器,打log def __getattribute__(self,obj): if obj == 'subject1': print('log subject1') return 'redirect python' else: #測試時註釋掉這2⾏,將找不到subject2 return object.__getattribute__(self,obj) def show(self): print('this is Itcast') s = Itcast("python") print(s.subject1) print(s.subject2)
執行結果:
log subject1
redirect python
cpp
__getattribute__的坑
class Person(object): def __getattribute__(self,obj): print("---test---") if obj.startswith("a"): rturn "hahha" else: return self.test def test(self): print("heihei") t.Person() t.a #返回hahha t.b #會讓程式死掉 #原因是:當t.b執行時,會呼叫Person類中定義的__getattribute__方法,但是在這個方法的執行過程 #中if條件不滿足,所以 程式執行else裡面的程式碼,即return self.test 問題就在這,因為return 需 #要把self.test的值返回,那麼首先要獲取self.test的值,因為self此時就是t這個物件,所以 #self.test 就是t.test 此時要獲取t這個物件的test屬性,那麼就會跳轉到__getattribute__方法去 #執行,即此時產生了遞迴呼叫,由於這個遞迴過程中 沒有判斷什麼時候推出,所以這個程式會永無休 #止的執行下去,因為每次呼叫函式,就需要儲存⼀一些資料,那麼隨著呼叫的次數越來越多,最終記憶體吃 #光,所以程式崩潰 # # 注意:以後不要在__getattribute__方法中呼叫self.xxxx