You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以装饰器为标签动态导入工作流所需类?

用装饰器标记并动态导入指定类的实现方案

你的思路完全正确,这种方式和Flask通过装饰器注册路由的逻辑一致——我们可以让装饰器把目标类自动收集到全局注册表,工作流管理器直接从注册表提取需要的类,无需全量导入后再做类型检查。

具体实现步骤:

1. 实现装饰器与注册表

先创建一个专门的装饰器模块,用来定义标记装饰器和存放类的注册表:

# module_decorators.py
# 按模块类型分类的注册表
MODULE_REGISTRY = {
    'prediction': [],
    'crawler': []
}

def prediction_module(cls):
    # 将被装饰的类添加到预测模块注册表
    MODULE_REGISTRY['prediction'].append(cls)
    return cls  # 返回原类,不影响类的正常使用

def crawler_module(cls):
    # 将被装饰的类添加到爬虫模块注册表
    MODULE_REGISTRY['crawler'].append(cls)
    return cls

2. 用户自定义模块类(classes.py)

用户在编写自定义类时,直接导入装饰器标记目标类即可:

# classes.py
from module_decorators import prediction_module, crawler_module

@prediction_module
class PredictionModule:
    def run(self):
        print("执行预测模块逻辑")

@crawler_module
class CrawlerModuleWithCustomName:
    def run(self):
        print("执行自定义爬虫模块逻辑")

# 无关类不受影响,不会被收集
@some_other_decorator
class OtherIrrelevantClassUsedSomewhereElse:
    pass

3. 工作流管理器获取目标类

工作流管理器只需导入classes.py触发装饰器的注册逻辑,然后直接从注册表提取需要的类:

# workflow_manager.py
from module_decorators import MODULE_REGISTRY
# 导入classes.py,触发装饰器执行,完成类的注册(无需显式引用类)
import classes

# 获取所有标记为预测模块的类
prediction_modules = MODULE_REGISTRY['prediction']
# 获取所有标记为爬虫模块的类
crawler_modules = MODULE_REGISTRY['crawler']

# 实例化并运行模块
for module_cls in prediction_modules:
    module_instance = module_cls()
    module_instance.run()

for module_cls in crawler_modules:
    module_instance = module_cls()
    module_instance.run()

扩展说明:

  • 如需支持更多模块类型,只需在MODULE_REGISTRY中新增对应键,并添加同名装饰器即可
  • 被装饰的类依然可以正常被其他模块导入使用,装饰器仅做注册标记
  • 这种方式完全避免了from classes import *后逐个检查类类型的冗余操作,逻辑更清晰高效

内容的提问来源于stack exchange,提问作者asuprem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:36:15