Форум сайта python.su
Есть класс с набором методов, которые вызываются и выполняют некую простую работу с атрибутом экземпляра класса. Нужно как-то реализовать возможность расширения функциональности с помощью системы плагинов.
Подскажите как это примерно можно сделать? Пока не могу придумать, как быть.
Офлайн
Если я правильно понял, то добавление плагина, ведет к расширению функциональности, в частности, которое можно понимать как появление новых методов у уже существующих экземляров класса, так и будущих. Если так, то это все можно реализовать, например, с помощью __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)
Офлайн
Надо посмотреть, но думаю лишний раз вызывать getattr наверное дольше
class Ta: def __init__(self): self.q="ww" def x(self): print(self.q) Ta.x=x a=Ta() a.x()
Офлайн
Чет мне кажеться что это нетривиальная задача. Вы должны написать чтото типа 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!")
[code python][/code]
Отредактировано PEHDOM (Апрель 1, 2017 17:56:35)
Офлайн