您现在的位置是:网站首页 > 分类 > 文章详情

python中的反射与动态导入

T2019年4月26日 17:45555人围观
简介反射使得程序具有在运行时动态修改自己的结构和行为的能力。动态的导入模块,主要用于反射或者延迟加载模块

首先,目录结构是这样的,然后我们在index.py中测一把:

1、第一种方式,使用__import__

def run():
    inp = input("请输入要访问的URL>>>")
    m, f = inp.split('/')
    obj = __import__("lib."+m, fromlist=True)  # 如果不加上fromlist=True,只会导入lib目录
    if hasattr(obj, f):  # 判断一个对象里面是否有inp属性或者inp方法,返回BOOL值
        # 获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
        # 需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
        # 可以在后面添加一对括号
        func = getattr(obj, f)  # getattr返回obj这个对象的属性值f
        func()
    else:
        print('404')

if __name__ == '__main__':
    run()


2、第二种方式,也是推荐使用的方式importlib.import_module(它实现了__import__)

def run2():
    inp = input("请输入要访问的URL>>>")
    m, f = inp.split('/')
    obj = importlib.import_module(m)
    if hasattr(obj, f):
        func = getattr(obj, f)
        func()
    else:
        print('404')

if __name__ == '__main__':
    run2()

前面讲了getattr通过反射的反射获取类中的方法/属性,那么还有什么知识点呢,看下双下划线的getattr的妙用(__getattr__):

import time


class FileHandle:
    def __init__(self, filename, mode='r', encoding='utf-8'):
        self.file = open(filename, mode, encoding=encoding)

    def write(self, line):
        t = time.strftime('%Y-%m-%d %T')
        self.file.write("%s %s" % (t, line))

    def __getattr__(self, item):
        return getattr(self.file, item)

f1 = FileHandle('b.txt', 'w+')
f1.write('hangzhou')
f1.seek(0)
print(f1.read())  # f1实例下面没有read方法,那么就会调用__getattr__方法,最后根据getattr取到self.file下面的read方法,最后的最后加上()执行方法
f1.close()

常用的魔法函数:__init____new____getattr____str____call__

文章评论

阿里云-云大使推广
阿里云-云服务器推广

微信公众号