正常狀況下,當調用類的方法或屬性時,若是不存在,就會報錯
要避免這個錯誤,除了能夠加上那個要調用但不存在的屬性外,Python還有另外一個機制,那就是寫一個__getattr__()方法,動態返回一個屬性
只有在沒有找到屬性的狀況下,才調用__getattr__,已有的屬性會直接在類屬性裏查找,不會在__getattr__中查找函數
class Student(object): def __init__(self): self.name = 'Michael' def __getattr__(self, attr): if attr=='score': return 99 if attr=='age': return lambda: 25 #要讓class只響應特定的幾個屬性,咱們就要按照約定,拋出AttributeError的錯誤 raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr) s = Student() print(s.name) #輸出:'Michael' print(s.score) #輸出:99,當調用不存在的score屬性時,Python解釋器會調用__getattr__(self, 'score')來嘗試得到屬性,這樣就會返回score的值 s.age() #輸出:25,返回函數也是徹底能夠的 print(s.abc) #輸出:None,任意調用如s.abc都會返回None,由於定義的__getattr__默認返回就是None
能夠把一個類的全部屬性和方法調用所有動態化處理了,不須要任何特殊手段
這種徹底動態調用的特性的做用就是,能夠針對徹底動態的狀況做調用spa