zoukankan      html  css  js  c++  java
  • 【Python之路】特别篇--Python反射

    反射

    说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式

    1.  import commons
    2.  __import__('commons')
    

    如果是多层导入:

    1. from list.text import commons 
    2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录
    

    实例:

    # lib  - commons.py
    
    NAME = 'Maria'
    def f1():
        return "F1"
    
    def f2():
        return "F2"
    
    def f3():
        return "F3"
    
    
    ****************************
    # index.py
    
    moudle = __import__('lib.commons',fromlist=True)
    
    ret = moudle.f1()
    print(ret)
    # F1

      反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:

    moudle = __import__('lib.commons',fromlist=True)
    
    # 获取成员
    ret = getattr(moudle,'f1',None)    # 可以设置默认值,没找到时 ret = None
    print(ret)
    # <function f1 at 0x00000090548CF2F0>
    
    # 获取全局变量:
    ret = getattr(dd,"NAME",None)
    
    # 检查成员
    ret = hasattr(moudle,'f11')     # 因为有f1方法所以返回True
    print(ret)
    
    # 设置成员
    setattr(moudle,"AGE",18)	     # 内存中创建了一个全局变量
    ret = getattr(moudle,'AGE',None)
    print(ret)
    
    setattr(moudle,"ADD",lambda a: a +1 )    # 内存中创建了一个函数
    ret = getattr(moudle,'ADD',None)
    print(ret(100))
    
    # 删除成员
    delattr(moudle,'f3')
    ret = hasattr(moudle,'f3')
    print(ret)
    

    对于反射小节:

    反射:
    # 根据字符串的形式去某个模块中寻找东西
    # 根据字符串的形式去某个模块中判断东西是否存在
    # 根据字符串的形式去某个模块中设置东西
    # 根据字符串的形式去某个模块中删除东西
    # 根据字符串的形式去对象 (某个模块) 中操作成员
    
    结论:
    1.根据字符串的形式导入模块。
    2.根据字符串的形式去对象(某个模块)中操作其成员 
    

    基于反射实现类Web框架的路由系统

    实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块并通过 hasattr和getattr 检查并获取函数返回值。

    # lib - commons.py
    def login():
        return 'login'
    
    def logout():
        return 'logout'
    
    ********************************
    # index.py
    
    
    target_url = input('请输入url:')
    target_module,target_func =target_url.split('/')
    
    moudle = __import__('lib.'+target_module,fromlist=True)
    
    if hasattr(moudle,target_func) == True:
        func = getattr(moudle,target_func)
        ret = func()
        print(ret)
    else :
        print('404 Not Found!')
    

      

  • 相关阅读:
    形象理解ERP(转)
    禁用windows server 2008 域密码复杂性要求策略
    How to adding find,filter,remove filter on display method Form
    Windows Server 2008 R2激活工具
    How to using bat command running VS development SSRS report
    Creating Your First Mac AppGetting Started
    Creating Your First Mac AppAdding a Track Object 添加一个 Track 对象
    Creating Your First Mac AppImplementing Action Methods 实现动作方法
    Creating Your First Mac AppReviewing the Code 审查代码
    Creating Your First Mac AppConfiguring the window 设置窗口
  • 原文地址:https://www.cnblogs.com/5poi/p/6146491.html
Copyright © 2011-2022 走看看