什麼是反射?#是什麼 答:用字符串數據類型的變量名來訪問這個變量的值 反射的方法:getattr hasattr setattr delattr 好處:優化代碼 1.getattr 用法:getattr(object, name[,default]) -> value 返回object中name字符串對應的方法和屬性,不存在返回默認值default。 若是沒有傳default,那麼找不到就會報錯 #用在哪,怎麼用? #類 靜態屬性,靜態方法,類方法 class A: ATTR = '靜態屬性' @classmethod def func0(cls): print('類方法') @staticmethod def func1(): print('靜態方法') #反射查看屬性 print(getattr(A, 'ATTR')) #反射調用類方法 getattr(A, 'func0')() #反射調用靜態方法 getattr(A, 'func1')() #對象 對象屬性,對象方法 class B: def __init__(self, name): self.name = name def func0(self): print('普通方法') b = B('Jake') #反射查看對象屬性 print(getattr(b, 'name')) #反射查看對象方法 getattr(b, 'func0')() #模塊 import os print(os.sep) print(getattr(os, 'sep')) #反射本身模塊中的內容,須要先找到本身當前文件所在的命名空間 import sys def func0(): print('my_func0') my_namespace = sys.modules['__main__'] my_namespace.func0() getattr(my_namespace, 'func0')() 2.hasattr 用法:hasattr(object, name) #判斷object中有沒有一個name字符串對應的方法和屬性 #若是存在返回True,不存在返回False,通常與getattr配合使用 class A: ATTR = '靜態屬性' print(hasattr(A, 'ATTR'))#Trule print(hasattr(A, 's'))#False 3.setattr 用法:setattr(object, name, value) 修改object中name字符串對應的屬性name變爲value class A: ATTR = '靜態屬性' @staticmethod def func1(): print('靜態方法') setattr(A, 'ATTR', '靜態屬性大哥') print(A.ATTR) 4.delattr 用法:delattr(object, name) 刪除object中name字符串對應的屬性和方法 class A: ATTR = '靜態屬性' @staticmethod def func1(): print('靜態方法') print(A.__dict__) delattr(A, 'ATTR') delattr(A, 'func1') print(A.__dict__)