内置函数补充 之 反射

Posted evenyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内置函数补充 之 反射相关的知识,希望对你有一定的参考价值。

getattr 反射

为什么要有反射?

当在设计一个页面访问的时候,通过用户输入相应的url,进入相应的页面,在用户输入的url地址不存在的时候,返回404错误。

def run():
    inp = input(请输入要访问的url:)
    if inp == login:
        commons.login()
    elif inp == logout:
        commons.logout()
    elif inp == home:
        commons.home()
    else:
        print(404)


run()
技术分享图片
def login():
    print(炫酷登录页面)


def logout():
    print(炫酷退出页面)


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

但通过以上的形式进行编写,如果一旦需要增添更多的页面的时候,代码写入的工作量就变得巨大 

 

getattr / hasattr

通过反射即可实现更高效的代码,也是基于反射实现类Web框架的路由系统,

getattr(commons,inp) 的含义就是让getattr自己去commons模块中寻找inp输入中对应的函数,即是login就对应login,是logout就应对logout。
import commons

def run():
    inp = input(请输入要访问的url:)
    #利用字符串的形式去对象(模块)中操作(寻找/检查)成员
    if hasattr(commons,inp):    #检查是否有相应的成员,如果有进行操作
        func = getattr(commons,inp) #操作成员
        func()
    else:
        print(404)


run()
技术分享图片
def login():
    print(炫酷登录页面)


def logout():
    print(炫酷退出页面)


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

反射的4个内置函数分别为:

getattr、hasattr、setattr、delattr ,其作用为获取成员、检查成员、设置成员、删除成员

 

__import__()

如果不同的def函数没有集中在同一个.py文件的模块中,而是根据所能提供的不同功能,散列的分布在众多的.py文件中的时候。

我们不可能去一个一个的import xxx对众多的模块进行一一导入,这个时候我们也可以对import的导入模块的操作进行反射

即以"字符串"的形式导入模块。

def run():
    inp = input(请输入要访问的url:)

    m,f = inp.split(/)
    obj = __import__(m)
    if hasattr(obj,f):    #检查是否有相应的成员,如果有进行操作
        func = getattr(obj,f) #操作成员
        func()
    else:
        print(404)


run()

 

各__import__()和各.py文件之间的关系图

技术分享图片

 

建设中....

以上是关于内置函数补充 之 反射的主要内容,如果未能解决你的问题,请参考以下文章

python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法

python内置函数之attr反射

重修课程day26(面向对象6之反射,内置函数和常用模块)

python之反射和内置函数__str____repr__

python基础之内置函数补充匿名函数递归函数

面向对象之反射及内置方法