反射

原创 2016年06月01日 00:45:27

反射

正常导入模块是用import 模块 ;这样的句子导入的,如果需要按照用户输入的内容进行导入的话,就要用到反射:以字符串的形式去对象中(某个模块)操作其成员。

DD = __import__('模块')
  • 以字符串的形式去某个模块中寻找东西:getattr
  • 以字符串的形式去某个模块中判断东西是否存在:hasattr
  • 以字符串的形式去某个模块中设置东西:setattr
  • 以字符串的形式去莫莫格模块中删除东西:delattr

根据用户输入的内容导入模块

inp = input("请输入模块:")
print(inp, type(inp))   #导入的类型是str类,str类只有通过__import__ 导入
dd = __import__(inp)
r = dd.f1()     #模块中有个f1函数,执行f1函数(这个模块是自定义的)
print(r)

根据用户输入的模块和模块内函数,找到模块和函数并执行,getattr

inp = input("请输入模块:")
inp_func = input("请输入函数:")
dd = __import__(inp)    
dd_func = getattr(dd, inp_func)    #getattr,在某个模块内以字符串的形式查找指定函数,再把这个函数定义个变量

result = dd_func()  #dd_func 等于执行函数 commons.f?
print(result)

在模块中创建函数和删除函数,这里进行的操作只在内存中进行,不写入磁盘

import commons  #commons为自定义函数

hn = input("请输入函数的名字:")
if hasattr(commons, hn):
    print("存在")
else:
    setattr(commons, hn, lambda : print("哈哈儿"))    #这里用lambda表达式来创建函数
    print("不在,创建完成")
    target_func = getattr(commons, hn, None)    #getattr最后面的一个参数,如果找不到这个函数的时候返回None要不然会报错
    target_func()
dn = input("请输入删除的函数:")
delattr(commons, dn)
r = hasattr(commons, dn)
print(r)

模拟网站判断URL

from lib import acccount
url = input("请输入url:")
inp = url.split("/") [-1]   #取分割后的最后一个元素
if hasattr (acccount, inp):
    tar_func = getattr(acccount, inp)
    r = tar_func()
else:
    print("404")

有的时候模块的路径不跟当前文件在同一个路径,就要用到下面这种格式来带着from 路径 import 模块格式

from 路径 import 模块
__import__ ('路径.' + '模块', fromlist=True)

根据用户输入的模块和函数,来调用模块并查找函数执行
这个例子只是试验的例子,与实际环境不同

url = input("输入url:")

target_module, target_func = url.split('/') #把输入的url分隔,一个代表模块,一个代表函数

m = __import__ ("lib." + target_module, fromlist=True)  #将模块路径组合起来,fromlist代表以from格式调用模块,如果不加调用不了

if hasattr(m, target_func):
    target_func = getattr(m, target_func)
    r = target_func()
    print(r)
else:
    print("404")
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ReflectUtil反射工具类

  • 2017年11月06日 16:13
  • 5KB
  • 下载

android 利用反射获取当前系统sdk版本等属性

在android系统中,/system/build.prop中含有大量系统相关的信息: # begin build properties # autogenerated by buildinfo...

.NET中反射的应用 获取Dll参数

  • 2016年04月06日 17:26
  • 49KB
  • 下载

java反射原理

  • 2016年03月21日 09:30
  • 45KB
  • 下载

且谈谈我对Java反射的理解

Java培训、Android培训、iOS培训、.Net培训、期待与您交流!  在张老师的课程当中,谈到了反射的概念,用冯伟立学长的最简单的一句话来说就是:反射就是把Java类中的各种成分映射成相应的J...

java反射机制

  • 2016年06月05日 21:04
  • 7KB
  • 下载

用反射的思想解释一下传说中的Fastjson解析

首先,反射机制可以拿来做什么?我的理解是反射机制可以拿到类类型的属性和方法,无论是共有的还是私有的,都可以拿到。而在用传统的方式解析的时候,我们需要执行的频繁的操作就是去通过key拿到对应的值,这是一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射
举报原因:
原因补充:

(最多只允许输入30个字)