反射:經過字符串映射或修改程序運行時的狀態、屬性、方法ide
反射有如下三個方法:spa
hasattr(object, name) 判斷一個對象(object)裏是否有對應的字符串(name)的屬性
getattr(object, name) 根據字符串(name)去獲取對象(object)裏的,對應方法的內存地址(即,獲取對應的方法)
setattr(object, name,value) 給對象(object)添加屬性(name)值(value)
delattr(object,name) 刪除對象的屬性code
實例:對象
def sleep(self): print('%s在睡覺' % self.name) def talk(): print('說話') class People(object): sex = '男' def __init__(self, name): self.name = name def eat(self): print('%s正在吃東西' % self.name) p = People('simple') print(hasattr(p, 'eat')) # 返回True # 判斷p這個對象中是否有eat這個屬性。 print(hasattr(p, 'name')) # 返回True f = getattr(p, 'eat') # 獲取eat的內存地址,即,獲取eat方法 print(f) # 打印eat的內存地址 print(f()) # 打印eat的返回值,即,執行eat方法 # 變量操做 str = input('變量:').strip() val = input('變量的值:').strip() if hasattr(p, str): # 在p中是否存在str變量,str是用戶傳入的參數。若是存在,則執行如下操做。 func = getattr(p, str) # 獲取p中str變量 print('原來的變量:%s=%s'%(str,func)) setattr(p,func,val) # 修改p中str變量的值 f = getattr(p,func) # 從新獲取p中str變量 print('修改後的變量:%s=%s'%(str,val)) # 打印str的值 else: # 在p中不存在str變量,執行如下操做。 setattr(p,str,val) # 給p添加變量str,並賦值val --> str = val gv = getattr(p,str) # 獲取p中新添加的str變量 print('新增了變量:%s=%s'%(str,gv)) # 打印新添加的str變量值 delattr(p, str) # 刪除變量 print('刪除了變量:%s' % str) # 刪除p中str變量 print('是否還存在變量%s:%s'%(str,hasattr(p,str))) # 刪除以後,再判斷屬性是否存在
執行結果:blog
def sleep(self): print('%s在睡覺' % self.name) def talk(): print('說話') class People(object): sex = '男' def __init__(self, name): self.name = name def eat(self): print('%s正在吃東西' % self.name) p = People('simple') print(hasattr(p, 'eat')) # 返回True # 判斷p這個對象中是否有eat這個屬性。 print(hasattr(p, 'name')) # 返回True f = getattr(p, 'eat') # 獲取eat的內存地址,即,獲取eat方法 print(f) # 打印eat的內存地址 print(f()) # 打印eat的返回值,即,執行eat方法 # 方法操做 str = input('方法:').strip() if hasattr(p, str): # 在p中是否存在str方法,str是用戶傳入的參數。若是存在,則執行如下操做。 func = getattr(p, str) # 獲取p中str方法 print('方法%s執行結果:'%(str),end='') func() # 執行方法 else: # 在p中不存在str方法,執行如下操做。 # setattr(p,str,sleep) # 給p添加了類方法sleep,帶self參數 setattr(p,str,talk) # 給p添加方法talk,不帶self參數 # sleep = getattr(p,str) # 獲取p中新添加的str方法的內存地址 talk = getattr(p,str) print('新增了方法:%s,返回結果:'%str) # 打印新添加的str變量值 # sleep(p) # 類方法調用,帶self talk() # 普通方法調用,不帶self delattr(p, str) # 刪除方法 print('刪除了方法:%s' % str) # 刪除p中str變量 print('是否還存在變量%s:%s'%(str,hasattr(p,str))) # 刪除以後,再判斷屬性是否存在
執行結果:ip