zoukankan      html  css  js  c++  java
  • 第四十九,反射基本介绍

    反射最初理解1

    通过字符串的形式,导入模块2

    我们前面讲到的导入模块,都是import 模块名称  如:import mk   这种方式导入的3

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import mk #导入mk模块
    a = mk.dlu() #运行模块里的函数
    print(a) #执行函数
    # 输出
    # 用户登录
    # None

    如果模块名称是字符串类型,则无法导入模块4

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import "mk" #导入mk模块
    a = mk.dlu() #运行模块里的函数
    print(a) #执行函数
    # 输出
    #   File "H:/py/index.py", line 3
    #     import "mk" #导入mk模块
    #               ^
    # SyntaxError: invalid syntax

    所以要想模块是字符串类型导入模块,有另外的一种方式

    __import__()接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称5

    使用方法1:模块名称变量 = __import__("模块文件名称")

    使用方法2:如果模块在多层文件夹下:模块名称变量 = __import__("模块路径到模块文件名称")

    格式1:a = __import__("mk")

    格式2:a = __import__("lib.ska.mk",fromlist=True)

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    a.dlu() #执行模块下的dlu()函数

    如果模块在多层文件夹下

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("lib.ska.mk",fromlist=True) #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    b = a.dlu()#执行函数
    print(b)#打印函数返回值
    # 输出
    # 用户登录
    # None

    通过字符串的形式,去模块中寻找指定函数,或者全局变量,并执行6

    getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值7

    使用方法:赋值变量 = getattr(模块名称, "字符串形式函数名称或变量名称", 如果没找到默认返回值)

    格式:f = getattr(a,"dlu",None)

    字符串形式查找函数

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """通过字符串的形式,去模块中寻找指定函数或者全局变量,并执行"""
    f = getattr(a,"dlu",None) #getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值
    f()

     字符串形式查找全局变量

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """通过字符串的形式,去模块中寻找指定函数或者全局变量,并执行"""
    f = getattr(a,"ASDF",None) #getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值
    print(f) #打印全局变量

    hasattr()内置函数,到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False7

    使用方法:赋值变量 = hasattr(模块名称, "字符串形式函数名称或变量名称")

    格式:f = hasattr(a,"ASDF")

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """内置函数,到指定模块查找指定函数或者指定全局变量"""
    f = hasattr(a,"ASDF") #hasattr()内置函数,到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
    print(f) #打印全局变量
    # 输出
    # True

    setattr()内置函数,为模块在内存里添加全局变量或者函数8

    使用方法:setattr(模块名称, "字符串形式函数名称或变量名称",全局变量值或lambda表达式)

    格式:setattr(a,"MF","8796")

    为模块添加全局变量

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """内置函数,为模块在内存里添加全局变量或者函数"""
    setattr(a,"MF","8796") #setattr()内置函数,为模块在内存里添加全局变量或者函数
    g = getattr(a,"MF",None) #到模块查找到添加的MF全局变量
    print(g)#打印出添加的全局变量
    # 输出
    # 8796

    为模块添加函数

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """内置函数,为模块在内存里添加全局变量或者函数"""
    setattr(a,"f1",lambda b,c: b + c) #setattr()内置函数,为模块在内存里添加全局变量或者函数
    f1 = getattr(a,"f1",None) #到模块查找到添加的f1()函数
    sfg = f1(1,2) #执行f1函数并传值
    print(sfg)#打印出函数的执行结果
    # 输出
    # 3

    delattr()内置函数,删除模块在内存里的函数或者全局变量9

    使用方法:delattr(模块名称, "字符串形式函数名称或变量名称")

    格式:delattr(a,"dlu")

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """字符串类型的模块名,导入mk模块"""
    a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
    """内置函数,删除模块在内存里的函数或者全局变量"""
    b = hasattr(a,"dlu") #到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
    print(b) #打印返回值True,说明模块里有dlu()函数
    
    delattr(a,"dlu") #delattr()内置函数,删除模块在内存里的函数或者全局变量
    
    c = hasattr(a,"dlu") #到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
    print(c) #打印返回值False,说明模块内存里已经删除了这个函数
    # 输出
    # True
    # False

    反射总结:10
    根据字符串的形式去某个对象(模块)中寻找指定的函数或者全局变量
    根据字符串的形式去某个对象(模块)中判断指定的函数或者全局变量是否存在
    根据字符串的形式去某个对象(模块)中设置指定的全局变量或者函数
    根据字符串的形式去某个对象(模块)中删除指定的函数或者全局变量

    反射的意义:根据字符串的形式去对象(模块)中操作其成员11

    基于反射模拟Web框架路由系统,根据用户请求的url地址后缀,获取后缀名称,到指定模块查找执行后缀对应的函数12

    函数模块

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def shou():
        print("首页")
    
    def gong():
        print("公司简介")
    
    def chp():
        print("产品展示")
    
    def liou():
        print("留言板")

    判断页面

    """根据用户请求的url地址后缀,获取后缀名称,到指定模块执行后缀对应的函数"""
    url = "www.jxiou.com/liou"
    a = url.split("/") #根据/分割域名字符串,返回列表
    b = a[len(a)-1] #获取列表的元素个数,在索引出域名后缀
    
    from lib.ska import mk #导入模块
    if hasattr(mk,b): #判断指定模块里是否有后缀函数
        c = getattr(mk,b) #如果有后缀函数,找到后缀函数赋值给一个变量
        print(c()) #执行打印后缀函数
    else: #如果模块里没有后缀函数,打印404
        print("404")

    基于反射模拟Web框架路由系统,根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,查找到指定模块下的指定函数并执行函数13

    也就是根据url地址提供的模块名称和函数名称,查找到对应的模块,和模块下对应的函数执行

     函数模块1

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def shou():
        print("首页")
    
    def gong():
        print("公司简介")
    
    def chp():
        print("产品展示")
    
    def liou():
        print("留言板")

     函数模块2

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def hout():
        print("后台首页")
    
    def houd()
        print("后台订单")

    判断页面1

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,到指定模块执下找到指定函数并执行函数"""
    url = "www.jxiou.com/mk/gong"
    a = url.split("/") #根据/分割域名字符串,返回列表
    b = a[len(a)-1] #获取后缀函数名
    c = a[len(a)-2] #获取后缀模块名
    
    d = __import__("lib.ska.{}".format(c),fromlist=True) #根据url模块名称找到模块
    if hasattr(d,b): #判断url函数在url模块里是否存在
        liou = getattr(d,b) #如果存在,找到函数赋值给一个变量
        print(liou()) #执行打印变量
    else: #如果不存在404
        print("404")
    
    # 输出
    # 公司简介
    # None

    判断页面2

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,到指定模块执下找到指定函数并执行函数"""
    url = "www.jxiou.com/hou/houd"
    a = url.split("/") #根据/分割域名字符串,返回列表
    b = a[len(a)-1] #获取后缀函数名
    c = a[len(a)-2] #获取后缀模块名
    
    d = __import__("lib.ska.{}".format(c),fromlist=True) #根据url模块名称找到模块
    if hasattr(d,b): #判断url函数在url模块里是否存在
        liou = getattr(d,b) #如果存在,找到函数赋值给一个变量
        print(liou()) #执行打印变量
    else: #如果不存在404
        print("404")
    
    # 输出
    # 后台订单
    # None
  • 相关阅读:
    Dockerfile使用案例
    Centos创建sudo用户免密使用
    yaml实例
    k8s学习过程中需要注意的地方
    docker部署redmine项目管理软件
    kubernetes陈述式常用命令
    mysql误删除数据后如何恢复
    kubeadm安装的k8s集群卸载方式
    虚拟机vmware centos7 扩展磁盘空间
    'React/RCTBundleURLProvider.h' file not found
  • 原文地址:https://www.cnblogs.com/adc8868/p/5869447.html
Copyright © 2011-2022 走看看