Python 反射

---恢复内容开始---

1.假设我们有两个模块,commons和index,其中commons定义了一些方法,index定义了访问方法。

commons.py

#coding:utf-8
def login():
    print ("登录页面")

def logout():
    print ("退出页面")

def home():
    print ("主页面")

index.py
#coding:utf-8 import commons def run(): inp = input("请输入要访问的URL>>>") if inp == 'login': commons.login() elif inp == 'logout': commons.logout() elif inp == 'home': commons.home() else: print ('404')

假设我们要访问其中的一些页面,这些页面都是传递的字符串,一个网站有成千上万个页面,那么是不是我们要写成千上万的字符串输入形式呢?所以,我们要利用反射来处理。

我们将index改写成下面的样子:

#coding:utf-8
import commons
def run():
    inp = input("请输入要访问的URL>>>")
    if hasattr(commons,inp):
        func = getattr(commons,inp)
        func()
    else:
        print ("404")

hasattr是判断后面的模块中是否有这样的字符串(inp)形式,如果有,可以利用getattr(commons,inp)来处理字符串和对应函数名之间的关系,这就是反射!

2.但是平时我们的函数肯定不会只写在一个模块中,每个模块中都有我们定义的函数,譬如我们有如下的三个模块,每个模块都有相应的功能:

commons.py
def home():
    print ("主页面")

account.py
def login():
    print ("登录页面")

def logout():
    print ("退出页面")

manager.py
def order():
    print ("订单页面")

现在我们希望在index.py中调用这些方法的时候通过account/login这样的方式来实现,那么就需要我们同时将模块名和方法名同时以字符串的形式传递过来。

index.py

#
coding:utf-8 def run(): inp = input("请输入要访问的URL>>>") m,f = inp.split('/') obj = __import__(m) if hasattr(obj,f): func = getattr(obj,f) func() else: print ("404") if __name__ == '__main__': run()

那么index.py模块中的方法要进行上面的改写,__import__()方法可以将模块名字以字符串的形式接收。

3.如果我们将目录结构调整一下,将commons.py,account.py,manager.py三个模块放在lib文件夹之下,如下图:

这个时候如果我们要访问这些模块里的方法的话,就必须采用lib.commons.home()这样的方式了,因为我们的index.py必须做相应的修改:

#coding:utf-8
def run():
    inp = input("请输入要访问的URL>>>")
    m,f = inp.split('/')
    obj = __import__("lib."+m,fromlist=True)
    if hasattr(obj,f):
        func = getattr(obj,f)
        func()
    else:
        print ("404")
原文地址:https://www.cnblogs.com/python-study/p/5712641.html