不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

Python动态导入模块与动态函数调用

有例如以下的结构:

│  dynamic.py
│
└─a
    │  aClass.py
    │  utils.py
    └─__init__.py

aClass.py:

class aClass:
    def method(self, type):
        return f"{type} return by aClass.method"

    @staticmethod
    def staticmethod(type):
        return f"{type} return by staticmethod"

utils.py:

def testMethod(type):
    return f'{type} testMethod()'

dynamic.py:

import importlib

module = importlib.import_module('a.aClass') #绝对导入
print(module.aClass().method('默认调用'))
print(module.aClass.staticmethod('默认调用'))

#module = importlib.import_module('.aClass', 'a') #相对导入

args = ['动态调用']
kwargs = {}
result = eval("module.aClass().method")(*args, **kwargs)
print(result)
result = eval("module.aClass.staticmethod")(*args, **kwargs)
print(result)

module = importlib.import_module('a.utils')
print(module.testMethod('默认调用'))

result = eval("module.testMethod")(*args, **kwargs)
print(result)

执行dynamic.py的输出结果:

默认调用 return by aClass.method
默认调用 return by staticmethod
动态调用 return by aClass.method
动态调用 return by staticmethod
默认调用 testMethod()
动态调用 testMethod()

相关链接

importlib --- import 的实现:https://docs.python.org/zh-cn/3.7/library/importlib.html

eval:https://docs.python.org/zh-cn/3.7/library/functions.html#eval

不允许评论
粤ICP备17049187号-1