1. 程式人生 > >Python類中反射的作用

Python類中反射的作用

屬性 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類中反射的作用