python反射详解

反射

1.自定义模块

 1 NAME = 'alex'
 2 
 3 def f1():
 4     return "f1执行成功"
 5 
 6 
 7 def f2():
 8     return "F2"
 9 
10 
11 def f3():
12     return "F3"
commons.py

2.__import__():通过字符串的形式导入模块

  例子1

1 inp = input("请输入模块:")
2 print(inp, type(inp))
3 dd = __import__(inp)
4 print(dd.f1())
5 
6 #请输入模块:commons
7 #commons <class 'str'>
8 #f1执行成功

  例子2

 1 #导入模块
 2 import test.com
 3  
 4 from test import com
 5  
 6 r = __import__('test.com')
 7  
 8 print(r)
 9 # <module 'test' from 'D:\untitled\反射\test\__init__.py'>
10  
11 r = __import__('test.com', fromlist=True)
12  
13 print(r)
14 # <module 'test.com' from 'D:\untitled\反射\test\com.py'>

3.反射:根据字符串的形式去某个对象(模块)中寻找东西

  例1

1 import commons
2 target_func = getattr(commons, 'f1')
3 print(target_func())
4 
5 #f1执行成功

  例2

 1 dd = __import__('commons')
 2  
 3 # getattr() 通过字符串的形式,去模块中寻找指定函数,并执行
 4 inp_func = input("请输入要执行的函数:")
 5 # target_func 和 模块中名为inp_func的函数 指向的同一块内存
 6 target_func = getattr(dd, inp_func)
 7 result = target_func()
 8 print(result)
 9 
10 #请输入要执行的函数:f1
11 #f1执行成功

4.反射的所有功能

反射: 根据字符串的形式对象(某个模块)中操作其成员
getattr():根据字符串的形式去某个对象(包括模块)获取它的成员根据字符串的
hasattr():判断去某个对象(包括模块)中判断东西是否存在
setattr():根据字符串的形式去某个对象(包括模块)中设置东西
delattr():根据字符串的形式去某个对象(包括模块)中删除东西
 1 #反射:根据字符串的形式去某个模块中寻找东西
 2 
 3 target_func = getattr(commons,"NAME",None)
 4 print(target_func)
 5 target_func()   #找到函数加()就执行函数
 6 
 7 #根据字符串的形式去某个模块中判断东西是否存在
 8 r = hasattr(commons,"NAME")
 9 print(r)
10 
11 根据字符串的形式去某个模块中设置东西(不改变模块,只是内存)
12 setattr(commons,"AGE",18)
13 
14 #根据字符串的形式去某个模块中删除东西(不改变模块,只是内存)
15 delattr(commons,'NAME')
16 r = hasattr(commons,"NAME")
17 print(r)

5.web框架路由系统

  内部调用模块

1 def login():
2     return 'LOGIN'
3 
4 
5 def logout():
6     return 'LOGOUT'
7 
8 def nb():
9     return '非常牛b的功能'
lib.account

  5.1传统方法 

# !/usr/bin env python
# -*- coding:utf-8 -*-
from lib import account
 
url = input('请输入url:')
# 当url非常多得时候,那么就要写100个if else
if url.endswith('login'):
    r = account.login()
    print(r)
elif url.endswith('logout'):
    r = account.login()
    print(r)
elif url.endswith('nb'):
    r = account.nb()
    print(r)
else:
    print('404')

#请输入url:www.wuwen666.com/login
#LOGIN

  5.2基于反射

# !/usr/bin env python
# -*- coding:utf-8 -*-
from lib import account
 
url = input('请输入url:')
# 基于反射
inp = url.split('/')[-1]
if hasattr(account, inp):
    func = getattr(account, inp)
    r = func()
    print(r)
else:
    print('404')
 

#请输入url:www.wuwenhennb.com/login
#LOGIN

  5.3基于反射(改进)类似于Django等web框架

# 以上的例子中,只有一个模块存放了可以调用的函数
# 当大量函数分布在不同的模块中的时候,我们需要针对性的导入模块
# 我们可以输入模块名和函数名,利用反射导入模块,再利用反射找到函数
# 模块名/函数名
url = input('请输入url:')
# 基于反射
target_module, target_func = url.split('/')
# 导入模块
m = __import__('lib.'+ target_module, fromlist=True)
# 找到函数
if hasattr(m, target_func):
    func = getattr(m, target_func)
    r = func()
    print(r)
else:
    print('404')

#请输入url:account/login
#LOGIN

 

  

原文地址:https://www.cnblogs.com/Acekr/p/7467728.html