第十三篇 反射
一概念
根据字符串的形式去对象 (某个模块)中去操作其成员
二、方法
getattr 根据字符串的形式去对象 (某个模块)中去操作其成员
hasattr 根据字符串的形式去某个模块中判断东西是否存在
setattr 根据字符串的形式去某个模块中设置东西
delattr 根据字符串的形式去某个模块中删除东西
代码如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- NAME = "a" def f1(): return "f1" def f2(): return f2 def f3(): return f3
#!/usr/bin/env python # -*- coding:utf-8 -*- import commonts tar_func = getattr(commonts,"f1",None) print (tar_func()) tar_func() #根据字符串的形式去某个模块中判断东西是否存在bool r = hasattr(commonts,"NAME") print(r) #给commonts模块设置全局变量 r1 = setattr(commonts,"AGE",18) print(r1) r = hasattr(commonts,"AGE") print(r) #给commonts模块设置函数,并且判断是否存在 r2 = setattr(commonts,"AB",lambda a:a+1) r = hasattr(commonts,"AB") print(r) #在内存中删除commonts内存中的变量 r3 = delattr(commonts,"NAME") r = hasattr(commonts,"NAME") print(r)
三、以字符串的形式导入模块
一般的导入模块是
import 模块 as 新名字
如果要导入lib包中的test包中的com模块如下:
form lib.test import com
但是上面的模块都是一个对象
如何让导入的模块是字符串?
如下:
1、
inp = input("请输入模块:") #用户输入的模块是字符串,真正的模块是对象,所以下面要用__import__ inp_func = input("请输入要执行的函数:") #用户输入的是字符串,而不是方法,所以要用getattr方法 #__import__ 用于以字符串的形式导入模块 dd = __import__(inp) #模块中寻找函数并且执行函数 target_func = getattr(dd,inp_func) #在获取到的函数名后面加上()表示,执行函数 result = target_func() print(result)#这里是取的返回值
__import__(“模块名字”):这里的模块名字是字符串
2、
__import__(“lib.test.com”,fromlist=True) 这个是导入其他包和包里面的模块
问题:根据用户输入的内容,导入模块,并且执行模块中的函数