首页 > 技术文章 > 第十三篇 反射

pyrene 2017-02-19 02:39 原文

一概念

根据字符串的形式去对象 (某个模块)中去操作其成员

二、方法

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)  这个是导入其他包和包里面的模块

 

问题:根据用户输入的内容,导入模块,并且执行模块中的函数

 

推荐阅读