一、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