zoukankan      html  css  js  c++  java
  • 反射

     1.反射 是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
    根据字符串的形式取对象(某个模块)操作成员
     
     
    2通过字符串导入模块
    a = __import__("模块名")
    a = __import__('lib.test.com', fromlist=True)
    通过字符串的形式,去模块中寻找指定的函数, 并执行
    		a = __import__("模块名")  用于以字符串的形式导入模块
    		a = __import__('lib.test.com', fromlist=True) 导入嵌套几层的文件中的模块 
    inp = input('请输入模块:')
    print(inp,type(inp))   查看模块的类型
    xin = __import__(inp)  用于字符串形式导入模块
    
    ss = xin.f1()          执行指定的函数
    print(ss) 
    cc = xin.f2()
    print(cc)
    dd = xin.f3()
    print(dd)
    

    python中的反射功能是由以下四个内置函数提供:

    getattr。 用于以字符串的形式去某个模块中寻找函数 在获取到的函数名后加() 表示执行函数

    hasattr、根据字符串的形式去某个模块中判断东西是否存在

    setattr、根据字符串的形式去某个模块中设置内容

    delattr,根据字符串的形式去某个模块中删除某个内容

    简单查看的方式:

    class Foo(object):
     
        def __init__(self):
            self.name = 'yigeyagng'
     
        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')

    另外一种方式:

    inp = input('请输入模块:')
    inp_func = input('请输入执行的函数:')
    xx = __import__(inp)               #通过以字符串的形式寻找模块
    get = getattr(xx,inp_func)        #用于以字符串的形式去某个模块中寻找函数 重新赋值
    ss = get()                        #将get加上()就是执行函数
    print(ss)
    
    import fan                          #导入模块
    #
    cc = hasattr(fan,'XXX')             #去模块中判断是否存在
    print(cc)
    
    fan.f1()                            #执行模块中的 f1 函数
    setattr(fan,'ZZZ',lambda a:a + 1)   #去某个模块中设置内容
    zz = hasattr(fan,'ZZZ')             #之后再查看一下内容
    print(zz)
    
    delattr(fan,'XXX')                  #模块中删除某个内容
    vv = hasattr(fan,'XXX')             #查看之后的内容
    print(vv)
    

    3,实例:基于反射实现类Web框架的路由系统

    #############三种实现方式##########
    from xxx import count
    #复杂写法
    url = input('请输入url:')  #等待用户输入的模块名
    if url.endswith('login'):  #判断输入的是不是login结束的
        r = count.login()      #执行count模块的login函数
        print(r)
    elif url.endswith('logout:'): 
        r = count.logout
        print(r)
    elif url.endswith('lognb:'):
        r = count.lognb
        print(r)
    else:                           否则都不是
        print('404')                就输入404
    #优化写法
    url = input('请输入url:')
    inp = url.split('/')[-1]
    if hasattr(count,inp):
        sss = getattr(count,inp)
        r = sss()
        print(r)
    else:
        print('404')
    #再进一步优化
    inp = input('请输入url:')
    sss,get = inp.split('/')
    m = __import__('xxx.'+sss,fromlist=True)
    if hasattr(m,get):
        get = getattr(m,get)
        r = get()
        print(r)
    else:
        print('404')
  • 相关阅读:
    计算机网络基础:TCP运输连接管理(三次握手 + 四次挥手)
    Zookeeper集群及配置
    Maven安装及配置
    SpringMVC拦截器+Spring自定义注解实现权限验证
    Spring之AOP配置
    设置Google浏览器不缓存JS
    数据加密之AES
    SpringMVC配置多个自定义拦截器
    利用Zookeeper实现分布式锁
    数据加密之RSA
  • 原文地址:https://www.cnblogs.com/guokaixin/p/5547372.html
Copyright © 2011-2022 走看看