2016-11-06 26 views
1

我有幾個我希望包含在我的所有插件中的幫助器方法(例如在持久存儲器中操作列表或設置配置模板),但它看起來像從文檔(和實踐中)插件只能從BotPlugin和BotPlugin繼承。這讓我最初的想法是讓自己的基本bot類包含所有這些有用的行爲,然後讓單個插件從那裏繼承。BotPlugin的繼承

我很好奇爲什麼errbot是這樣設置的,如果可能有一個合理的解決方法來啓用插件類的繼承?

例如:

class BaseBot(BotPlugin): 
    # common methods 

from base_bot import BaseBot 
class MyPlugin1(BaseBot): 
    # doesn't work, errbot won't detect the plugin 

回答

1

但是它看起來像從文檔(和實踐),該插件必須從只BotPlugin和BotPlugin繼承。

這是正確的,其原因主要與我們使用yapsy作爲我們的插件管理器的事實有關。它必須知道插件實際加載哪個類(如果插件包含多個類)。

BotPlugin類還包含一個插件可以處理的所有方法(以及它可能實現的所有回調函數),所以它也可以作爲一個框架。

現在,根據您的實際問題,您可以使用mixin作爲共享功能。定義一個通用類(可以說,class CommonFunctionalityMixin),它可以被所有的插件被導入,然後讓這些插件繼承它除了BotPlugin

class MyPlugin(BotPlugin, CommonFunctionalityMixin): 
    # ...has all of BotPlugin as well as CommonFunctionalityMixin 

這種技術的一個真實世界的例子見errcron