zoukankan      html  css  js  c++  java
  • 整理一下反射

    反射是个啥:通过一个URL,按照一定的格式切割这个URL,并获得相应的切割字符串,通过这个字符串去后台匹配方法并返回给前端的一种方式。举个例子:

    #!/usr/bin/env python
    #coding:utf-8
    def index():
        return 'index'
    def dev():
        return 'dev'
    View Code
    #!/usr/bin/env python
    #coding:utf-8
    import home
    
    controller,action = raw_input('url:').split('/')
    module = __import__(controller)
    if hasattr(module,action):
        func = getattr(module,action)
        ret = func()
        print ret
    else:
        print '不存在对应的方法: %s ' % (action)
    View Code

    home.py与index.py文件。

    __import__:单纯是一个导入作用,将home字符串作为模块导入,前提是你的当期的路径下存在该模块。

    将模块与成员方法用字符串导入,并执行对应方法。

    这个例子用到了hasattr,getattr两个方法,python的反射中还有两个方法,接下来就介绍下:

    class Foo(object):
     
        def __init__(self):
            self.name = 'name'
     
        def func(self):
            return 'func'
     
    obj = Foo()
     
    # #### 检查是否含有成员 ####
    hasattr(obj, 'name')
    hasattr(obj, 'func')
     
    # #### 获取成员 ####
    getattr(obj, 'name')
    getattr(obj, 'func')
     
    # #### 设置成员 ####
    setattr(obj, 'age', 18)
    setattr(obj, 'show', lambda num: num + 1)
     
    # #### 删除成员 ####
    delattr(obj, 'name')
    delattr(obj, 'func')

    hasattr,getattr,setattr,delattr,我经常用到的4中方法。应该已经很清楚了,不需要再解释了。

    这里再说下通过反射的方式去获得类的对象的属性。

    一般获取对象属性如下:

    class Foo(object):
     
        def __init__(self):
            self.name = 'name'
     
        def func(self):
            return 'func'
     
    obj = Foo()
     
    # 访问字段
    obj.name
    # 执行方法
    obj.func()

    其他方式获取obj对象中的name变量指向内存中的值 “name”:

    class Foo(object):
    
        def __init__(self):
            self.name = 'name'
    
        def func(self):
            return 'func'
    
    # 不允许使用 obj.name
    obj = Foo()
    
    #一种方式通过:对象成员里面去获取‘name’
    print obj.__dict__['name']
    View Code
    class Foo(object):
    
        def __init__(self):
            self.name = 'alex'
    
        def func(self):
            return 'func'
    
    # 不允许使用 obj.name
    obj = Foo()
    
    #通过反射的方式去获取这个对象的属性
    print getattr(obj, 'name')
    View Code

    最后结合一个实际小demo的web的例子去感受下反射:

    #!/usr/bin/env python
    #coding:utf-8
    import wsgiref
    from wsgiref.simple_server import make_server
    
    class Handler(object):
    
        def index(self):
            return 'index'
    
        def news(self):
            return 'news'
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        temp = url.split('/')[1]
        obj = Handler()
        is_exist = hasattr(obj, temp)
        if is_exist:
            func = getattr(obj, temp)
            ret = func()
            return ret
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('127.0.0.1', 8001, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
  • 相关阅读:
    VMware rhel 7 网卡绑定
    VMware 克隆虚拟机后网卡无法启动
    rhel7 批量新建和删除用户
    2019.3.27 Linux 学习
    20180313前端笔试
    javascript中的一些问题
    flex布局学习笔记(阮一峰flex布局教程)
    个推面试总结
    笔试题目整理
    @JsonFormat与@DateTimeFormat注解的使用
  • 原文地址:https://www.cnblogs.com/shoug/p/5096000.html
Copyright © 2011-2022 走看看