zoukankan      html  css  js  c++  java
  • Python反射

    一.反射:


    1.通过字符串的形式导入模块

    2.通过字符串的形式去模块中寻找指定函数,并执行

    3.反射:

    a.根据字符串的形式去某个模块中寻找东西, 函数:__import__, getattr

    b.根据字符串的形式去某个模块中判断东西是否存在,  函数:hasattr

    c.根据字符串的形式去某个模块中设置东西,  函数:setattr

    d.根据字符串的形式去某个模块中删除东西,  函数:delattr

    总结:反射是根据字符串形式去对象(某个模块)中操作其成员,一切事物皆对象!

    #应用:根据用户输入的内容导入模块
    inp = input('请输入模块名:')
    inp_func = input('请输入要执行的函数:')
    #__import__()用于以字符串的形式导入模块
    dd = __import__(inp)#相当于import commons as dd
    target_func = getattr(dd,inp_func)#getattr用于以字符串的形式去某个模块中找函数
    result = target_func()#获取到的函数后加()表示执行函数
    print(result)
    import commons
    target_func = getattr(commons, 'name',None)#None:没有name这个全局变量报空
    print(target_func)
    # target_func()#如果是函数就执行
    
    r = hasattr(commons, 'name')#判断没有的话返回False
    print(r)
    
    setattr(commons,'AGE',18)#设置全局变量
    setattr(commons,'AGE',lambda a: a + 1)#设置内存里面函数,跟原文件没关系
    r = hasattr(commons,'AGE')
    print(r)
    
    delattr(commons,'AGE')#删除内存里面的数据
    r = hasattr(commons,'AGE')
    print(r)
    a = __import__('lib.test.com',fromlist=True)#导入lib模块下面的test模块下面的com模块,必须带fromlist否则只能找到lib.
    等同于:from lib.test import com

     基于反射实现web框架的路由系统:

    #根据输入url地址查找页面(根据后缀来找到页面),这种有多少url就要写多少判断
    from lib import acccount
    
    url = input('请输入url:')
    if url.endswith('login'):
        r = acccount.login()
        print(r)
    elif url.endswith('logout'):
        r = acccount.login()
        print(r)
    else:
        print('404')
    
    
    #再定义lib文件夹下面的acccount模块
    def login():
        return 'login'
    
    def logout():
        return 'logout'
    #根据输入url地址查找页面(根据后缀来找到页面),这种用反射取的值判断只写一次就行
    from lib import acccount
    
    url = input('请输入url:')
    inp = url.split('/')[-1]#分割取用户输入的最后一个
    if hasattr(acccount,inp):
        target_func = getattr(acccount,inp)
        r = target_func()
        print(r)
    else:
        print('404')
    
    #再定义lib文件夹下面的acccount模块
    def login():
        return 'login'
    
    def logout():
        return 'logout'
    #根据模块名/函数名查找url(可以在多个模块里面找到url)终极版
    url = input('请输入url:')
    targe_module, target_func = url.split('/')#模块名和函数名的格式
    m = __import__('lib.' + targe_module, fromlist=True)#导入用户输入的模块
    if hasattr(m, target_func):
        target_func = getattr(m,target_func)
        r = target_func()
        print(r)
    else:
        print('404')
  • 相关阅读:
    BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
    BZOJ1305 [CQOI2009]dance跳舞 【网络流】
    BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】
    BZOJ1103 [POI2007]大都市meg 【树剖】
    BZOJ1927 [Sdoi2010]星际竞速 【费用流】
    POJ3450 Corporate Identity 【后缀数组】
    POJ3623 Best Cow Line, Gold 【后缀数组】
    POJ3415 Common Substrings 【后缀数组 + 单调栈】
    关于线上bug
    关于线上bug
  • 原文地址:https://www.cnblogs.com/zcok168/p/9147215.html
Copyright © 2011-2022 走看看