Python;Как импортировать методы в класс 'pluginstyle'? - PullRequest
1 голос
/ 06 августа 2011

Я пытаюсь создать класс, который импортирует свои методы из плагиноподобных модулей.

Что я хочу для этого класса, так это чтобы он мог импортировать функции / переменные из модулей, которые хранятся вотдельная папка, то есть «плагины».Возможно ли это?

Я знаю о __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()

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Я бы разбил проблему на две части: превращение списка файлов в список модулей, затем расширение класса для включения функций из этих модулей.

Бретт Кэннон рассмотрел какимпортировать модуль только из пути к файлу , поэтому я не буду дублировать его здесь ... Хотя я предлагаю вам проверить модуль 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 выиграли "t ведут себя точно так же, как нативные методы ... Если вы дадите больше информации о том, что вы пытаетесь сделать, я мог бы дать более полезный ответ.

0 голосов
/ 06 августа 2011

Я экспериментировал и копался в Google, и я нашел решение, которое могло бы работать благодаря подсказке о setattr и getatt от Дэвида Вулевер и Эта страница отДжесси Ноллер.

Вот что у меня пока есть, и, похоже, оно работает, но требует очистки и тонкой настройки.

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 в импорт ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...