Python动态加载模块、类、函数的几种方式

admin 2024年12月24日13:37:40评论6 views字数 1623阅读5分24秒阅读模式

目录

  1. 1. exec()
  2. 2. __import__()
  3. 3. importlib

1. exec()

使用exec来执行Python导入模块的命令。

1
2
3
module_name = "module01"
exec("import " + module_name)
module01.echo()

2. __import__()

单独使用__import__() 可以直接加载模块,但是当需要动态加载类、函数时,就需要配合getattr来实现。

实现步骤:

  1. 获取模块名(module_name)
  2. 使用__import__(module_name)导入Python模块
  3. 使用getattr(module_name, class_name/function_name)获取类、方法的对象
    例子:

模块(module01.py)中包含一个Index类和一个echo方法。主程序(main.py)使用模块名动态调用其echo方法。

module01.py:

1
2
3
4
class Index:
def echo(self, content):
print(self)
print(content)

main.py:

1
2
3
4
5
6
7
8
module_name = "module01"
class_name = "Index"
function_name = "echo"

module_object = __import__(module_name) #将模块加载为对象
module_class = getattr(module_object, class_name) #获取模块当中的类对象
module_class_object = module_class() #将类实例化
module_class_object.echo("Hello World") #调用echo方法

此外,还可以这样调用类中的函数:

main.py:

1
2
3
4
5
6
7
8
9
10
module_name = "module01"
class_name = "Index"
function_name = "echo"

module_object = __import__(module_name) #将模块加载为对象
module_class = getattr(module_object, class_name) #获取模块当中的类对象
module_function = getattr(module_class, function_name) #获取类中方法对象
module_function("Hello World")
# 或者直接 module_class.echo()
# 需要注意的是,使用这种方式调用方法,方法的参数值不需要加self。

参考:

python 动态调用模块&类&方法

3. importlib

这种方式其实是__import__() 方式的扩展。Python官方文档推荐程序式地导入模块时应该使用 import_module() 而不是__import__

实现动态加载的方式与第二种类似:

module01.py

1
2
3
4
class Index:
def echo(self, content):
print(self)
print(content)

main.py

1
2
3
4
5
6
7
8
import importlib

module_name = "module01"
class_name = "Index"

module_object = importlib.import_module(module_name) #将模块加载为对象
module_class_object = module_object.Index() #将类实例化
module_class_object.echo("Hello World") #调用echo方法

(同样的这里可以配合getattr()使用)

使用importlib的一个好处就是还可以使用reload方法。在模块已经被导入的情况下,使用importlib.reload导入新的模块。

详情可见:importlib — import 的实现

- By:threezh1.com

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月24日13:37:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python动态加载模块、类、函数的几种方式https://cn-sec.com/archives/3547460.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息