zoukankan      html  css  js  c++  java
  • 内置函数补充 之 反射

    getattr 反射

    为什么要有反射?

    当在设计一个页面访问的时候,通过用户输入相应的url,进入相应的页面,在用户输入的url地址不存在的时候,返回404错误。

    def run():
        inp = input('请输入要访问的url:')
        if inp == 'login':
            commons.login()
        elif inp == 'logout':
            commons.logout()
        elif inp == 'home':
            commons.home()
        else:
            print('404')
    
    
    run()
    def login():
        print('炫酷登录页面')
    
    
    def logout():
        print('炫酷退出页面')
    
    
    def home():
        print('炫酷主页面')
    commons.py

    但通过以上的形式进行编写,如果一旦需要增添更多的页面的时候,代码写入的工作量就变得巨大 

    getattr / hasattr

    通过反射即可实现更高效的代码,也是基于反射实现类Web框架的路由系统,

    getattr(commons,inp) 的含义就是让getattr自己去commons模块中寻找inp输入中对应的函数,即是login就对应login,是logout就应对logout。
    import commons
    
    def run():
        inp = input('请输入要访问的url:')
        #利用字符串的形式去对象(模块)中操作(寻找/检查)成员
        if hasattr(commons,inp):    #检查是否有相应的成员,如果有进行操作
            func = getattr(commons,inp) #操作成员
            func()
        else:
            print('404')
    
    
    run()
    def login():
        print('炫酷登录页面')
    
    
    def logout():
        print('炫酷退出页面')
    
    
    def home():
        print('炫酷主页面')
    commons.py

    反射的4个内置函数分别为:

    getattr、hasattr、setattr、delattr ,其作用为获取成员、检查成员、设置成员、删除成员

    __import__()

    如果不同的def函数没有集中在同一个.py文件的模块中,而是根据所能提供的不同功能,散列的分布在众多的.py文件中的时候。

    我们不可能去一个一个的import xxx对众多的模块进行一一导入,这个时候我们也可以对import的导入模块的操作进行反射

    即以"字符串"的形式导入模块。

    def run():
        inp = input('请输入要访问的url:')
    
        m,f = inp.split('/')
        obj = __import__(m)
        if hasattr(obj,f):    #检查是否有相应的成员,如果有进行操作
            func = getattr(obj,f) #操作成员
            func()
        else:
            print('404')
    
    
    run()

    __import__()和各.py文件之间的关系图

    如果其中一个.py文件在另一个文件下目录之下就要通过fromlist = True来找到该.py文件

    def run():
        inp = input('请输入要访问的url:')
    
        m,f = inp.split('/')
        obj = __import__("lib." + m, fromlist = True)    #该模块在lib文件下路径之下的时候
        if hasattr(obj,f):    #检查是否有相应的成员,如果有进行操作
            func = getattr(obj,f) #操作成员
            func()
        else:
            print('404')
    
    
    run()

    总结:

    反射的实例:伪造Web框架的路由系统

    反射:基于字符串的形式去对象(模块)中操作其成员。getattr、hasattr、setattr、delattr 。

    扩展:导入模块

    import xxx
    from xxx import ooo
    
    obj  =  __import__("xxx")
    obj  =  __import__("xxx.oo.xxx", fromlist=True)
  • 相关阅读:
    cocos2d-x ios 设置横屏/竖屏(全)
    决策树之ID3算法实现(python)
    基于Spring开发的DUBBO服务接口测试
    Mac电脑下配置maven环境变量
    Mac Eclipse+Maven+TestNg+ReportNg 生成测试报告
    TestNG+Maven+IDEA环境搭建
    115个Java面试题和答案——终极列表(上)
    115个Java面试题和答案——终极列表(下)
    阿里巴巴常考面试题及汇总答案
    阿里面试回来,想和Java程序员谈一谈
  • 原文地址:https://www.cnblogs.com/evenyao/p/9190868.html
Copyright © 2011-2022 走看看