• python反射详解


    反射

    1.自定义模块

     1 NAME = 'alex'
     2 
     3 def f1():
     4     return "f1执行成功"
     5 
     6 
     7 def f2():
     8     return "F2"
     9 
    10 
    11 def f3():
    12     return "F3"
    commons.py

    2.__import__():通过字符串的形式导入模块

      例子1

    1 inp = input("请输入模块:")
    2 print(inp, type(inp))
    3 dd = __import__(inp)
    4 print(dd.f1())
    5 
    6 #请输入模块:commons
    7 #commons <class 'str'>
    8 #f1执行成功

      例子2

     1 #导入模块
     2 import test.com
     3  
     4 from test import com
     5  
     6 r = __import__('test.com')
     7  
     8 print(r)
     9 # <module 'test' from 'D:\untitled\反射\test\__init__.py'>
    10  
    11 r = __import__('test.com', fromlist=True)
    12  
    13 print(r)
    14 # <module 'test.com' from 'D:\untitled\反射\test\com.py'>

    3.反射:根据字符串的形式去某个对象(模块)中寻找东西

      例1

    1 import commons
    2 target_func = getattr(commons, 'f1')
    3 print(target_func())
    4 
    5 #f1执行成功

      例2

     1 dd = __import__('commons')
     2  
     3 # getattr() 通过字符串的形式,去模块中寻找指定函数,并执行
     4 inp_func = input("请输入要执行的函数:")
     5 # target_func 和 模块中名为inp_func的函数 指向的同一块内存
     6 target_func = getattr(dd, inp_func)
     7 result = target_func()
     8 print(result)
     9 
    10 #请输入要执行的函数:f1
    11 #f1执行成功

    4.反射的所有功能

    反射: 根据字符串的形式对象(某个模块)中操作其成员
    getattr():根据字符串的形式去某个对象(包括模块)获取它的成员根据字符串的
    hasattr():判断去某个对象(包括模块)中判断东西是否存在
    setattr():根据字符串的形式去某个对象(包括模块)中设置东西
    delattr():根据字符串的形式去某个对象(包括模块)中删除东西
     1 #反射:根据字符串的形式去某个模块中寻找东西
     2 
     3 target_func = getattr(commons,"NAME",None)
     4 print(target_func)
     5 target_func()   #找到函数加()就执行函数
     6 
     7 #根据字符串的形式去某个模块中判断东西是否存在
     8 r = hasattr(commons,"NAME")
     9 print(r)
    10 
    11 根据字符串的形式去某个模块中设置东西(不改变模块,只是内存)
    12 setattr(commons,"AGE",18)
    13 
    14 #根据字符串的形式去某个模块中删除东西(不改变模块,只是内存)
    15 delattr(commons,'NAME')
    16 r = hasattr(commons,"NAME")
    17 print(r)

    5.web框架路由系统

      内部调用模块

    1 def login():
    2     return 'LOGIN'
    3 
    4 
    5 def logout():
    6     return 'LOGOUT'
    7 
    8 def nb():
    9     return '非常牛b的功能'
    lib.account

      5.1传统方法 

    # !/usr/bin env python
    # -*- coding:utf-8 -*-
    from lib import account
     
    url = input('请输入url:')
    # 当url非常多得时候,那么就要写100个if else
    if url.endswith('login'):
        r = account.login()
        print(r)
    elif url.endswith('logout'):
        r = account.login()
        print(r)
    elif url.endswith('nb'):
        r = account.nb()
        print(r)
    else:
        print('404')
    
    #请输入url:www.wuwen666.com/login
    #LOGIN

      5.2基于反射

    # !/usr/bin env python
    # -*- coding:utf-8 -*-
    from lib import account
     
    url = input('请输入url:')
    # 基于反射
    inp = url.split('/')[-1]
    if hasattr(account, inp):
        func = getattr(account, inp)
        r = func()
        print(r)
    else:
        print('404')
     
    
    #请输入url:www.wuwenhennb.com/login
    #LOGIN

      5.3基于反射(改进)类似于Django等web框架

    # 以上的例子中,只有一个模块存放了可以调用的函数
    # 当大量函数分布在不同的模块中的时候,我们需要针对性的导入模块
    # 我们可以输入模块名和函数名,利用反射导入模块,再利用反射找到函数
    # 模块名/函数名
    url = input('请输入url:')
    # 基于反射
    target_module, target_func = url.split('/')
    # 导入模块
    m = __import__('lib.'+ target_module, fromlist=True)
    # 找到函数
    if hasattr(m, target_func):
        func = getattr(m, target_func)
        r = func()
        print(r)
    else:
        print('404')
    
    #请输入url:account/login
    #LOGIN

     

      

  • 相关阅读:
    flex-direction
    flex-grow
    Push API
    ServiceWorker.state
    Using Service Workers
    Promise.then
    Promise()
    Using promises
    node-rsa
    async.waterfall
  • 原文地址:https://www.cnblogs.com/Acekr/p/7467728.html
Copyright © 2020-2023  润新知