Python類中反射的作用
阿新 • • 發佈:2017-05-27
屬性 cnblogs argv 字符串 實現 span div init asa
#coding:utf-8 ‘‘‘ #反射的基本用法: hasattr 判斷一個方法是否存在於實例中 getattr 指定一個方法名字,獲取該方法的內存地址,加"()"括號並可執行 ‘‘‘ import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print("Server is starting...") def stop(self):print("Server is stopping") def restart(self): self.stop() self.start() #例子:獲取用戶輸入的第一個內容,調用相應的方法 if __name__ == "__main__": #sys.argv[1]表示:接收用戶輸入的第一個參數 #方法一:這種方法可以實現,但是很low(),不建議使用 # server = WebServer("127.0.0.1",3306) # cmd_server = {"start":server.start,"stop":server.stop,"restart":server.restart}# if sys.argv[1] in cmd_server: # cmd_server[sys.argv[1]]() # #方法二:但是這種方法有問題,怎麽把用戶輸入的字符串名字調用對應的方法呢? # cmd_server = sys.argv[1] # if cmd_server in WebServer.__dict__: # print(cmd_server) # WebServer("127.0.0.1",3306).cmd_server #cmd_server為用戶輸入的字符串名字,但是這樣調用顯然不行#方法三:利用hasattr和getattr方法判斷方法是否存在對象中並獲取對象中方法的內存地址 server = WebServer("127.0.0.1",3306) if hasattr(server,sys.argv[1]): #hasattr;判斷類中是否包含某一個方法和屬性 func = getattr(server,sys.argv[1]) #getattr;獲取server.start內存地址 func()
‘‘‘ setattr綁定一個函數到實例 說明:如何把一個類之外的函數,綁定到實例裏面呢? ‘‘‘ import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print("Server is starting...") def stop(self): print("Server is stopping") def restart(self): self.stop() self.start() #如何把這個函數綁定到實例裏呢? def run_server(obj,name): print("runing is %s"%obj.restart(),name) if __name__ == "__main__": server = WebServer("localhost",3306) setattr(server,‘run‘,run_server) #通過setattr方法把test_run函數綁定到server這個實例裏,方法名是"run" server.run(server,"apache")
‘‘‘ delattr刪除一個實例或者類中的方法 ‘‘‘ import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print("Server is starting...") def stop(self): print("Server is stopping") def restart(self): self.stop() self.start() def run_server(name): print("runing is %s",name) if __name__ == "__main__": server = WebServer("localhost",3306) setattr(server,‘run‘,run_server) delattr(WebServer, "start") #刪除類裏面的方法 delattr(server, "host") #刪除實例的屬性 delattr(server,‘run‘) #刪除通過setattr添加到實例的屬性 print(server.__dict__,WebServer.__dict__) #查看
Python類中反射的作用