反射

原创 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")
版权声明:本文为博主原创文章,未经博主允许不得转载。

反射,反射--程序员的快乐?

前几天帮助一位网友解决了一个问题,大概是他们公司的老板做了一个项目,听他的描述项目不是很大,但是他们老板想要做到程序的解耦,也就是说他们封装了一个dll文件,在上层调用时不提供给他们引用关系,对外的设...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年02月20日 12:12
  • 4684

java 反射详解通俗易懂

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。  那么什么是Java的反射呢?        大家都知道,要...
  • MissWwg
  • MissWwg
  • 2016年06月13日 18:33
  • 19408

Android 反射Method应用

本人喜欢把复杂的事情简单化,简单的事情复杂化---以前读书的时候,语文老师经常再三强调,写作文的时候不要把题目写”太大”了;只要写一件小事,写的越详细越动人就达到了目的! ---zhibao.liu...
  • qq_31726827
  • qq_31726827
  • 2015年12月08日 19:38
  • 1389

使用线程池和反射实现异步任务

反射,线程池,异步返回
  • Willon_tom
  • Willon_tom
  • 2016年09月22日 10:34
  • 334

[ javascript ] 反射与依赖注入!

对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply 方法,对回调进行调用即可,一般如下操作: 首先定义两个方法: var s...
  • yangzhihello
  • yangzhihello
  • 2015年05月30日 09:25
  • 3218

java反射技术破坏单例模式

一、 Java中的反射技术可以获取类的所有方法、成员变量、还能访问private的构造方法,这样一来,单例模式中用的私有构造函数被调用就会产生多个实例,编写代码测试一下。 package test;...
  • lws332969674
  • lws332969674
  • 2012年10月29日 21:07
  • 9184

java使用反射创建对象

Class对象中包括构造器(Constructor)、属性(Field)、方法(Method)。下面要讲的是通过反射来构造对应类的实例。 通过反射来生成对象有两种方式: 1、通过Class对象的n...
  • u013473691
  • u013473691
  • 2016年10月08日 17:12
  • 2844

scala 奇淫巧技 - 4.反射 对class/object反射

scala 反射 反射调用私有函数 静态函数
  • feloxx
  • feloxx
  • 2017年07月24日 18:00
  • 1472

反射技术在android中的应用

动态语言:一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管这样,JAVA有着一...
  • tiefeng0606
  • tiefeng0606
  • 2016年06月30日 13:53
  • 9733

JAVA 反射 动态调用不同类的静态方法

准备调用的类 package ss; public class Use {     public  static  Integer   demo( String s ){ ...
  • yjaspire
  • yjaspire
  • 2016年06月01日 09:10
  • 2965
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射
举报原因:
原因补充:

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