链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 

'''
反射:利用字符串去对象中操作成员
'''
'''
案例:
根据字符串到模块中执行模块中函数名与字符串一致的函数(以字符串的形式执行函数)
#下面所有操作都是基于内存的,setattr、delattr不会对对象造成影响
hasattr()  判断对象中是否存在成员
getattr()  从对象中查找成员
setattr()  在对象中设置(添加)成员
delattr()  从对象中删除成员
import commons

def run():
    s = input("请输入要执行的函数名:")

    #if s == 'login':
    #    commons.login()
    #elif s == 'logout':
    #    commons.logout()
    #elif s == 'home':
    #    commons.home()
    #else:
    #    print('404')

    #如果要手动进行判断输入的字符串对应的模块中的函数名,要写很长。要想很简单的就找到函数,可以用反射

    if hasattr(commons,s):   #判断commons模块中是否存在函数名与字符串s一致的函数,有则返回True
        func = getattr(commons,s)   #从commons模块中查找函数名与字符串s一致的函数
        func()   #执行函数
    else:
        print('404')

if __name__ == '__main__':
    run()
'''

'''
案例2:
以字符串的形式导入模块
__import__()   #导入模块,括号内是字符串 =====》也可以使用importlib模块

注意:
如果是导入其他目录下的模块,如:__import__('lib.commons'),默认情况下只会导入lib,而不是导入commons,要想导入完整,
需要添加参数:__import__('lib.commons',fromlist=True),这样就可以导入完整
'''


def run():
    s = input('请输入url:')   #commons/login形式
    m,f = s.split('/')
    obj = __import__(m)

    if hasattr(obj,f):
        func = getattr(obj,f)
        func()
    else:
        print(404)



if __name__ == '__main__':
    run()

 

posted on 2016-11-04 14:06  链条君  阅读(170)  评论(0编辑  收藏  举报