實例屬性和方法的動態處理(__getattr__)

正常狀況下,當調用類的方法或屬性時,若是不存在,就會報錯
要避免這個錯誤,除了能夠加上那個要調用但不存在的屬性外,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

相關文章
相關標籤/搜索