【问题标题】:What is the point of using dynamic import in Python?在 Python 中使用动态导入有什么意义?
【发布时间】:2022-01-30 21:10:36
【问题描述】:

假设有一堆类,根据传入的参数需要检测类并调用其句柄方法。

可能的类


class A:
    def handle(self):
       print('handle method of A class is invoking')

class B:
    def handle(self):
       print('handle method of B class is invoking')

class C:
    def handle(self):
       print('handle method of C class is invoking')

class D:
    def handle(self):
       print('handle method of D class is invoking')

class E:
    def handle(self):
       print('handle method of E class is invoking')

那么您是否建议像以下那样映射类?

class_mapping = {
    'a': A,
    'b': B,
    'c': C,
    'd': D,
    'e': E,
}

class Handler:
   def __init__(self, param):
      klass = class_mapping[param]
      instance = klass()
      instance.handle()

或者映射类路径并动态导入?为什么?

class_path_mapping = {
    'a': "folder_name.A",
    'b': "folder_name.B",
    'c': "folder_name.C",
    'd': "folder_name.D",
    'e': "folder_name.E",
}

class DynamicImportHandler:
   def __init__(self, param):
      klass = importlib.import_module(class_path_mapping[param])
      instance = klass()
      instance.handle()

【问题讨论】:

  • 从您问题中的示例来看,HandlerDynamicImportHandler 似乎不需要是类 - 除了初始化另一个类之外,它们什么都不做。您可以编写一个函数来创建并返回其中一个类的实例(按照您的第一种方法,因为它更简单)。

标签: python architecture software-design


【解决方案1】:

我建议遵循通常的规则:

  1. 如果要加载的 python 模块集是预先知道的,则导入它们。一个编写良好的模块在导入时不应该有任何副作用,包括过多的 CPU 或 I/O 负载。换句话说,导入应该是一种廉价的操作。

  2. 将动态加载保留在预先不知道要加载的模块的情况下,例如插件系统。

如果您认为您的案例不符合一般规则,请提供更多信息。

class_mapping dict 的第一种情况是:

handler = class_mapping[param] # create an instance

然后:

handler.handle() # invoke the method

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2018-10-30
    • 2018-11-21
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2013-10-22
    相关资源
    最近更新 更多