首页 > 技术文章 > 反射

xone 2017-04-23 16:08 原文

反射

__import__以字符串的形式导入模块

r= __import__('模块名')
r=__import__('lib.test.com',fromlist=true)  //导入多层级的模块用fromlist=true

 

getattr以字符串的形式去某个模块中寻找函数(可以是变量,也可以是函数)。

hasattr以字符串的形式去某个模块中判断东西是否存在。

setattr以字符串的形式去某个模块中设置变量或函数

delattr以字符串的形式去某个模块中删除变量或函数

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

 

commons.py

def F1():
    print('F1')

test.py

r = __import__('commons')  //__import__以字符串的形式导入模块
r.F1()

以上代码执行结果:

F1

 

通过字符串的形式,去模块中寻找指定函数,并执行。

commons.py

def F1():
    print('F1')

test.py

r = __import__('commons')

func=getattr(r,'F1')  //getattr以字符串的形式去某个模块中寻找函数,这里的F1可以是变量,也可以是函数。

func()    //在获取到的函数名后加()表示执行函数

 以上代码执行结果

F1

 

 test.py

r = __import__('commons')

val = hasattr(r,'age')
print(val)

setattr(r,'age',18)

val = hasattr(r,'age')
print(val)

delattr(r,'age')

val = hasattr(r,'age')
print(val)

以上代码执行结果

False
True
False

 

利用反射查看面向对象成员属性

实例一:

class Foo:
    def __init__(self, n):
        self.name = n
    def show(self):
        print('we')

# 反射
# 反射:类,只能找类里的成员
# r = hasattr(Foo, 'show')
# print(r)

# 反射:对象,可以找对象里的成员和类里的成员
obj = Foo('zhou')
r = hasattr(obj, 'name')
print(r)
r = hasattr(obj, 'show')
print(r)

以上代码执行结果

True
True

 

经典用法:

基于反射实现类web框架的路由系统

 

manage.py

def login():
    return 'login'

def logout():
    return 'logout'

def nb():
    return 'nb'

index.py

url = input('输入url:')
target_model,target_func = url.split('/')

m = __import__('lib.'+target_model, fromlist=True)

if hasattr(m,target_func):
    re = getattr(m,target_func)()
    print(re)

else:
    print('404')

运行index.py,输入account/login后运行结果:

login

 

推荐阅读