Найти - Пользователи
Полная версия: Релизация системы плагинов
Начало » Python для экспертов » Релизация системы плагинов
1
jon34
Есть класс с набором методов, которые вызываются и выполняют некую простую работу с атрибутом экземпляра класса. Нужно как-то реализовать возможность расширения функциональности с помощью системы плагинов.
Подскажите как это примерно можно сделать? Пока не могу придумать, как быть.
scidam
Если я правильно понял, то добавление плагина, ведет к расширению функциональности, в частности, которое можно понимать как появление новых методов у уже существующих экземляров класса, так и будущих. Если так, то это все можно реализовать, например, с помощью __getattr__:

 import types
class Awesome:
    plugins = {}
    def add_plugin(self, name, func):
        self.plugins.update({name: func})
    def __getattr__(self, name):
        if name in self.plugins:
            return types.MethodType(self.plugins[name], self)
        else:
            raise AttributeError
def my_plugin(self, a, b):
    print('a + b = ', a + b)
    print(self.plugins) # self is current instance....
    return a + b
a = Awesome()
b = Awesome()
a.add_plugin('adding', my_plugin)
b.adding(1, 2)
a.adding(2, 3)
doza_and
Надо посмотреть, но думаю лишний раз вызывать getattr наверное дольше
 class Ta:
    def __init__(self):
        self.q="ww"
def x(self):
    print(self.q)
Ta.x=x
a=Ta()
a.x()
Ну и плагины обычно грузят из папочки следовательно listdir glob и динамический импорт. Как альтернатива execfile
PEHDOM
Чет мне кажеться что это нетривиальная задача. Вы должны написать чтото типа API. тоесть заранее определить какие у вас бцдци плагины, какиеметоды будут им доступны, а так же саму структуру плагина.
Потом, создать например абстрактный класс с абстракными же методами, На их основе писать плагины подгружать их и уже оотуда дергать методы/атрибута класса
например , есть файл назовем его MyAPI.py
 class MyPlugin (object):
        def run (self):
                pass

потом вы создаете на его основе свой плагин
 import MyAPI
class testPlugin (MyAPI.MyPlugin):
        def __init__(self):
                pass
        def run (self):
                print(" Hello word!")
А в основном модуле пишете лоадер котороый ищет в указаной заранее папке файлы, импортирует их. читает перечень атрибутов. Проверяет плагин это или нет ( например проверяет чтобы он был наследником MyPlugin) и если да то создает инстанс класса и запукает instance.run().
Это кагбе самый простой интерфейс.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB