• 生成器与反射


    1. 生成器

    def f():        #生成器函数
        print(11)
        yield 1
    
        print(22)
        yield 2
    
        print(33)
        yield 3
    
        print(44)
        yield 4
    
    r = f()  # 这里只获取了一个生成器
    ret = r.__next__()  #11,进入生成器函数f(),直到返回第一个yield的值
    print(ret)          #1
    
    ret = r.__next__()  #22,根据上一次的位置接着执行,直到返回第二个yield的值
    print(ret)          #2
    

    2. 反射

    反射就是根据字符串的形式去对象(某个模块)中操作其成员。

    #index.py
    inp = input("输入模块:")
    print(inp, type(inp))   #inp是字符串类型
    
    dd = __import__(inp)
    inp2 = input("输入函数:")
    func = getattr(dd,inp2)
    
    ret = func()
    print(ret)
    
    
    #commens.py
    def f1():
       return "F1"
    

    当模块与当前文件不在同一目录下的时候,需要添加fromlist=True,否则python就找不到commens模块:

    dd = __import__('lib.test.commens',fromlist=True)
    

    (1) getattr

    以字符串的形式,获取模块中的某函数

    import commens
    
    target_func = getattr(commens, 'f1111', None)  # 加上None之后,如果模块中的函数不存在则直接返回None
    print(target_func)
    

    (2) hasattr

    以字符串的形式,判断模块中是否存在某函数

    import commens
    
    r = hasattr(commens, 'f22')
    print(r)    #False
    

    (3) setattr

    在内存中创建一个函数或全局变量,不会影响文件

    import commens
    
    r = hasattr(commens, 'ABC')
    print(r)    #False
    
    setattr(commens,'ABC',18)   在内存中创建一个全局变量
    #setattr(commens,'ABC',lambda a : a+1),也可以使用lambda创建函数
    r = hasattr(commens, 'ABC')
    print(r)    #True
    

    (4) delattr

    删除

    r = hasattr(commens, 'ABC')
    print(r)    #True
    
    delattr(commens,'ABC')
    
    r = hasattr(commens, 'ABC')
    print(r)    #False
    

    (5) web访问的简单模拟

    #index.py
    from lib import account
    
    url = input("输入url:")
    
    inp = url.split('/')[-1]    #获取url最后面的值
    
    if hasattr(account, inp):
        target_func = getattr(account, inp)
        r = target_func()
        print(r)
    else:
        print("404")
    
    
    #account.py
    def login():
        return "login"
        
    def logout():
        return "logout"
    
    
    #简单的web框架逻辑
    url = input('请输入"模块/函数":')
    
    target_model,target_func = url.split('/')
    m = __import__("lib."+ target_model,fromlist=True)
    
    if hasattr(m,target_func):
        func = getattr(m,target_func)
        r = func()
        print(r)
    else:
        print("404")
    
  • 相关阅读:
    element-ui el-tree竖向滚动条和横向滚动条问题
    菜单加滚动条相关样式
    echarts tree 树图总结,点击父节点动态生成子节点,树图数据过多高度自适应,点击子节点跳转页面。
    基于Mininet测量路径的损耗率
    RyuBook1.0案例一:Switching Hub项目源码分析
    深度学习之稠密连接⽹络(DENSENET)
    图形学之图像信号处理
    图形学之卷积滤波器
    图形学之信号处理
    Lecture13_光线追踪1(Whitted-Style Ray Tracing)_GAMES101 课堂笔记
  • 原文地址:https://www.cnblogs.com/whatisfantasy/p/6024640.html
Copyright © 2020-2023  润新知