📜  如何在Python中动态加载模块或类

📅  最后修改于: 2022-05-13 01:55:28.359000             🧑  作者: Mango

如何在Python中动态加载模块或类

Python提供了一个功能来创建和存储类和方法,并存储它们以供进一步使用。包含这些方法和类集的文件称为模块。一个模块里面可以有其他模块。

注意:有关详细信息,请参阅Python模块

示例:导入模块的简单示例如下所示,其中在同一目录下有两个文件,分别是 module.py 和 importing_mod.py。 module.py 文件充当 import_mod.py 文件的模块。

模块.py

# welcome method in the module 
def welcome(str):
    print("Hi ! % s Welcome to GfG" % str)

import_mod.py 文件

# importing module.py file 
import module as mod
  
  
# running the welcome method
mod.welcome("User_1") 

输出

Hi! User_1 Welcome to GfG

动态加载模块或类

上面代码中添加的模块是静态导入模块,即在编译时。在Python中,我们可以通过两种方式动态导入模块

  • 通过使用 __import__() 方法: __import__()是一个 dunder 方法(以双下划线开头和结尾的类方法也称为魔术方法)并且所有类都拥有它。它用于在类的实例中导入模块或类。下面给出了这个方法的一个例子,我们将在其中动态导入一个模块。模块文件现在修改为:

    模块.py

    # class inside the module
    class Welcome:
        def welcome(str):
            print("Hi ! % s Welcome to GfG" % str)
    

    动态导入.py

    class Dimport:
        def __init__(self, module_name, class_name):
            #__import__ method used
            # to fetch module
            module = __import__(module_name)
      
            # getting attribute by
            # getattr() method
            my_class = getattr(module, class_name)
            my_class.welcome('User_1')
        
    # Driver Code  
    obj = Dimport("module", "Welcome")
    

    输出

    Hi! User_1 Welcome to GfG
  • 使用 imp 模块:模块可以通过Python中的 imp 模块动态导入。下面的示例是使用 imp 模块的演示。它提供了find_module()方法来查找模块和 import_module import_module()方法来导入它。

    动态导入.py

    import imp
    import sys
      
      
    # dynamic import 
    def dynamic_imp(name, class_name):
          
        # find_module() method is used
        # to find the module and return
        # its description and path
        try:
            fp, path, desc = imp.find_module(name)
              
        except ImportError:
            print ("module not found: " + name)
              
        try:
        # load_modules loads the module 
        # dynamically ans takes the filepath
        # module and description as parameter
            example_package = imp.load_module(name, fp,
                                              path, desc)
              
        except Exception as e:
            print(e)
              
        try:
            myclass = imp.load_module("% s.% s" % (name,
                                                   class_name), 
                                      fp, path, desc)
              
        except Exception as e:
            print(e)
              
        return example_package, myclass
          
    #  Driver code
    if __name__ == "__main__":
        mod, modCl = dynamic_imp("GFG", "addNumbers")
        modCl.addNumbers(1, 2)
    

    输出

    Hi! User_1 Welcome to GfG