python_反射:动态导入模块

官方推荐方法:

test_mod.py

def hi():
    print('Hi')

test.py

import importlib

q = importlib.import_module('test_mod') #动态导入模块
q.hi()

python_反射:动态导入模块

如果导入文件夹下面的模块引号内可以这样:目录.模块名

  q = importlib.import_module('app.test_mod') #动态导入模块

调用的模块:lib文件夹下面的commons.py

def f1():
    print('函数1')

def f2():
    print('函数2')

def f3():
    print('函数3')

反射:根据用户输入字符导入模块并调用模块中的方法

import os

yhf = 'lib'

def wdc():
    inp = input('请输入(模块名/方法名):')
    # 将输入的字符串根据‘/’分割,并分别赋值给m和f
    try:
        m,f = inp.split('/')
        #   检测是要导入的模块是否存在
    except Exception:
        print('输入格式不正确!')
    else:
        if os.path.exists(yhf + '/' + m + '.py'):

            # 根据字符串导入模块,若导入文件夹下面的模块,需要后面添加fromlist=True
            obj = __import__(yhf + '.' + m, fromlist=True)
            # 检测模块中是否存在成员(模块,成员名),返回 T/F
            if hasattr(obj, f):
                #   根据字符串的形式去对象(模块)中寻找成员。返回成员名
                func = getattr(obj, f)  # (模块,用户输入的字符串)
                # 执行方法
                func()
            else:
                # 当方法名输入错误时
                print('没有找到该方法!')
        else:
            print('不存在此模块!')


wdc()

执行结果:

python_反射:动态导入模块

四个方法:

  delattr()  根据字符串删除方法

  setattr()  根据字符串创建方法

  hasattr()  根据字符串检测方法是否存在

  getattr()  根据字符串寻找方法