• Python类中反射的作用


    #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__)  #查看
  • 相关阅读:
    大数据量时(上千万),分页查询该怎么优化
    Nginx常见面试问题
    Tomcat常用的调优手段
    jenkens
    docker环境搭建httprunner接口自动化
    TypeError: string indices must be integers
    接口自动化简单框架
    phpStudy使用手册
    搭建测试环境
    【Linux】测试环境如何搭建?
  • 原文地址:https://www.cnblogs.com/l729414559/p/6912797.html
Copyright © 2020-2023  润新知