天天看點

Python學習: hasattr()、getattr()、setattr()函數簡介

一、hasattr(object, name)

判斷object對象中是否存在name屬性,當然對于python的對象而言,屬性包含變量和方法;有則傳回True,沒有則傳回False;需要注意的是name參數是string類型,是以不管是要判斷變量還是方法,其名稱都以字元串形式傳參;getattr和setattr也同樣;

class A():
    name = 'python'
    def func(self):
        return 'A()類的方法func()'

hasattr(A, 'name')
# 結果:True

hasattr(A, 'age')
# 結果:False

hasattr(A, 'func')
# 結果:True      

二、getattr(object, name[, default])

擷取object對象的屬性的值,如果存在則傳回屬性值,如果不存在分為兩種情況,一種是沒有default參數時,會直接報錯;給定了default參數,若對象本身沒有name屬性,則會傳回給定的default值;如果給定的屬性name是對象的方法,則傳回的是函數對象,需要調用函數對象來獲得函數的傳回值;調用的話就是函數對象後面加括号,如func之于func();

注意,如果給定的方法func()是執行個體函數,則不能寫getattr(A, ‘func’)(),因為fun()是執行個體函數的話,是不能用A類對象來調用的,應該寫成getattr(A(), ‘func’)();執行個體函數和類函數的差別可以簡單的了解一下,執行個體函數定義時,直接def func(self):,這樣定義的函數隻能是将類執行個體化後,用類的執行個體化對象來調用;而類函數定義時,需要用@classmethod來裝飾,函數預設的參數一般是cls,類函數可以通過類對象來直接調用,而不需要對類進行執行個體化;

class A():
    name = 'python'
    def func(self):
        return 'Hello world'
getattr(A, 'name')
# 結果:'python'

getattr(A, 'age')    # age變量不存在則報錯
# 結果:Traceback (most recent call last):
#   File "<pyshell#464>", line 1, in <module>
#     getattr(A, 'age')
# AttributeError: class A has no attribute 'age'

getattr(A, 'age', 20)
# 結果:20
getattr(A, 'func')
# 結果:<unbound method A.func>

getattr(A, 'func')()    # func()函數不能被A類對象調用,是以報錯
# 結果:Traceback (most recent call last):
#   File "<pyshell#470>", line 1, in <module>
#     getattr(A, 'func')()
# TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)

getattr(A(), 'func')()
# 結果:'Hello world'


class A(object):
    name = 'python'
    @classmethod
    def func(cls):
        return 'the method of A object.'

getattr(A, 'func')()
# 結果:'the method of A object.'      

三、 setattr(object, name, value)

class A():
    name = 'python'
    def func(self):
        return 'Hello world'

setattr(A, 'name', 'java')
getattr(A, 'name')
# 結果:'java'
# Python學習交流群:711312441
setattr(A, 'age', 20)
getattr(A, 'age')
# 結果:20      

四、示例

class A():
    name = 'python'
    def func(self):
        return 'Hello world'

if hasattr(A, 'age'):
    print(getattr(A, 'age'))
else:
    setattr(A, 'age', 20)

getattr(A, 'age')
# 結果:20