Python類(四)-反射
反射即通過字符串映射或修改程序運行時的狀態、屬性、方法
有4個方法:
hasattr():
hasattr(object,string):object為實例化的對象,string為字符串
判斷對象object裏是否有對應字符串string的方法或屬性,返回布爾型
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self): print(‘%s is eating ‘%self.name) if __name__ == ‘__main__‘: p = Person(‘John‘) #實例化Person類 argu = input(">>>:").strip() print(hasattr(p,argu))
運行,輸入name
類中有name這個屬性,返回True
輸入eat
類中有eat這個方法,返回True
輸入test
類中沒有test這個屬性和方法,返回False
getattr():
getattr(object,string[,default]):object為實例化的對象,string為字符串,default為默認值
根據字符串string來獲取對象object中的方法或屬性,如果對象object中沒有字符串string的屬性或方法,就會返回default的值,如果不設置default的值,將會報錯
獲取類中方法並調用
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() if hasattr(p,argu): getattr(p,argu)(‘meat‘)
執行結果
獲取類中屬性的值
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() print(getattr(p,argu))
如果字符串不是類中的屬性,則返回規定的默認值
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() print(getattr(p,argu,"test"))
輸入a,類中沒有a這個屬性,則返回規定的默認值test
setattr():
setattr(object,string,value):object為實例化的對象,string為字符串,value為值
setattr()用來設置方法或屬性
把傳入的字符串string設置為value名的函數,再通過getattr()來調用
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) #在類外定義一個函數 def talk(self): print("%s is talking"%self.name) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() setattr(p,argu,talk) #把傳入的字符串設置為talk函數 getattr(p,argu)(p) #把實例化的對象傳入函數中
運行,輸入a
調用的不是talk()函數,而是設置為talk()函數的字符串a
setattr()設置屬性
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() setattr(p,argu,‘Man‘) #設置屬性 print(getattr(p,argu))
傳入的字符串string,如果不是類中的屬性,將給類創建新屬性string,並賦值value給新屬性
傳入的字符串string,如果是類中的屬性,value將覆蓋原有的屬性
delattr():
delattr(object,string):刪除object對象中的string屬性
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name def eat(self,food): print(‘%s is eating %s‘%(self.name,food)) if __name__ == ‘__main__‘: p = Person(‘John‘) argu = input(">>>:").strip() delattr(p,argu) print(getattr(p,argu))
運行,輸入name
報錯,Person類中沒有了name屬性
Python類(四)-反射