Уведомления

Группа в Telegram: @pythonsu

#1 Март 27, 2017 01:35:25

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Релизация системы плагинов

Есть класс с набором методов, которые вызываются и выполняют некую простую работу с атрибутом экземпляра класса. Нужно как-то реализовать возможность расширения функциональности с помощью системы плагинов.
Подскажите как это примерно можно сделать? Пока не могу придумать, как быть.

Офлайн

#2 Март 27, 2017 04:02:18

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Релизация системы плагинов

Если я правильно понял, то добавление плагина, ведет к расширению функциональности, в частности, которое можно понимать как появление новых методов у уже существующих экземляров класса, так и будущих. Если так, то это все можно реализовать, например, с помощью __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)

Офлайн

#3 Март 27, 2017 07:30:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Релизация системы плагинов

Надо посмотреть, но думаю лишний раз вызывать 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



Офлайн

#4 Март 31, 2017 21:55:35

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Релизация системы плагинов

Чет мне кажеться что это нетривиальная задача. Вы должны написать чтото типа 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().
Это кагбе самый простой интерфейс.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 1, 2017 17:56:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version