【问题标题】:Dynamically import classes动态导入类
【发布时间】:2017-12-12 01:46:16
【问题描述】:

现在我有这样的脚本:

class threadEnum():
    pass

class first(threadEnum):
    pass

class second(threadEnum):
    pass

class third(threadEnum):
    pass

enums = [enum(domain, [], q=subdomains_queue, silent=silent, verbose=verbose) for enum in chosenEnums]
    for enum in enums:
        enum.start()
    for enum in enums:
        enum.join()

哪些类很长并且需要很多行。我需要将每个类移动到单独的文件中,然后将所有类导入主脚本。所以我创建了文件夹引擎并放入了三个文件,其中包含 first.py、second.py 和 third.py 类,还有文件 __init__.py

我想一定是这样的:

import importlib

class threadEnum():
    pass

chosenEnums = []
chosenEnums = ['first', 'second', 'third']

# Load classes from engines folder
for enumm in chosenEnums:
    module = 'engines'
    # create a global object containging our module
    mymethod = getattr(importlib.import_module('engines'), enumm)

enums = [enum(domain, [], q=subdomains_queue, silent=silent, verbose=verbose) for enum in chosenEnums]
    for enum in enums:
        enum.start()
    for enum in enums:
        enum.join()

但我得到错误:

AttributeError: 'module' 对象没有属性 'first'

怎么了? Python 2.7.6

【问题讨论】:

  • 尝试使用 geattr(...) 而不是 mymethod = importlob.import_module('engines.' + enumm)
  • 你可以试试__import__("{0}.{1}".format(module,enumm))
  • 好的。但现在我收到错误NameError: name 'threadEnum' is not defined
  • 可能是因为你没有在那个文件中定义类threadEnum
  • 所以我需要在每个类中重新定义threadEnum 类?还是使用相互导入?但是如何从引擎文件夹的根目录导入?

标签: python


【解决方案1】:

当您将文件夹作为模块导入时,其中的文件不会立即作为属性加载。

>>> import importlib
>>> print(dir(importlib.import_module('engines'))

['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

要加载它们,您必须使用import 语句。在这种情况下,您可以使用__import__("{0}.{1}".format(module,enumm))

【讨论】:

    【解决方案2】:

    通过使用简单的 if 语句并设置变量名作为对象,并使用 dir() 检测命名对象(类)中的对象。

    【讨论】:

    • 您能否详细说明您的建议?也许提供一个工作代码示例?
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多