【问题标题】:Python; How to import methods to a class 'pluginstyle'?Python;如何将方法导入类'pluginstyle'?
【发布时间】:2011-10-21 08:09:01
【问题描述】:

我正在尝试创建一个从类似插件的模块中导入其方法的类。

我希望这个类能够从存储在单独文件夹中的模块中导入函数/变量,即“插件”。这可能吗?

我知道__import__(),但是我怎样才能使用它来导入它们以便它们属于这个类?

假设我在“插件”文件夹中有以下模块:

plugins/pluginA.py
plugins/pluginB.py

在这些模块中,我有功能等。我希望能够在课堂上导入和访问它们。可能是这样的:

MyClass.pluginA.some_function_from_A()
MyClass.pluginB.some_function_from_B()

或者像这样

MyClass.some_function_fromA()
MyClass.some_function_fromB()

【问题讨论】:

    标签: python class plugins methods import


    【解决方案1】:

    我会将问题分为两部分:将文件列表转换为模块列表,然后扩展类以包含来自这些模块的函数。

    Brett Cannon 已经报道了how to import a module from just a file path,所以我不会在这里重复……虽然我建议您查看glob 模块。

    其次,如何扩展一个类以包含来自插件的功能。我会使用这样的东西:

    def extend(obj, plugin_modules):
        for module in plugin_modules:
            for export_name in dir(module):
                export = getattr(module, export_name)
                if callable(export):
                    setattr(obj, export_name, export)
    
    
    class MyClass(object):
        … code …
    
    extend(MyClass, plugin_modules)
    

    但是,我会警告您,这不太可能是您想要的,因为 MyClass 上的“插件”函数的行为与本机方法不完全相同……如果您提供更多信息关于你想要做什么,我也许可以给出一个更有帮助的答案。

    【讨论】:

    • 通过使用这两个我想我找到了答案,我已经在下面发布了。再次感谢。
    【解决方案2】:

    我一直在用 google 进行试验和搜索,我想出了一个可行的解决方案,这要归功于 David Wolever 的 setattrgetatt 以及 Jesse Noller 的 This page 的提示。

    这是我到目前为止所拥有的,它似乎正在工作,但需要清理和微调。

    class MyClass(object):
        def __init__(self):
            pass
    
        def import_plugins(self):
    
            plugins_to_import = []
            attribs_to_exclude = ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
            plugins = []
            plugins_dir = './plugins'
    
            # add the plugins directory to path
            if os.path.isdir(plugins_dir):
                sys.path.append(plugins_dir)
            else:
                print '%s is not a directory!' % (plugins_dir)
    
            # make a list of the plugins to import
            for plugin_file in os.listdir(os.path.abspath(plugins_dir)):
                #print plugin_file
                plugin_file_name, plugin_file_extension = os.path.splitext(plugin_file)
                if plugin_file_extension == '.py':
                    plugins_to_import.append(plugin_file_name)
    
            # import the plugins to a list
            for plugin in plugins_to_import:
                plugins.append(__import__(plugin))
    
            # add the attributes to self
            for plugin in plugins:
                for attribute in dir(plugin):
                    if attribute not in attribs_to_exclude:
                        self.__setattr__(attribute, getattr(plugin, attribute))
    

    现在的一个问题是弄清楚如何将self 传递给导入...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2020-12-25
      • 2013-06-05
      • 2020-11-23
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多