1

さまざまなサービスにファイルをアップロードできるプラグイン ベースのファイル アップローダーを実装したいと考えています。ディレクトリからすべての python モジュールをロードし、アップロード先のサービスに基づいてそれらを呼び出します。

すべてのプラグインの単なる抽象基本クラスである単純な BaseHandler があります

import abc

class BaseHandler():
   __metaclass__ = abc.ABCMeta

   @abc.abstractmethod
   def start(self,startString):
      return

BaseHandler から継承する単純なプラグインがあります

from BaseHandler import BaseHandler

class Cloud(BaseHandler):
    def start(self,startString): 
        return

そして、プラグインをロードして呼び出す実際のコード

import logging
import os
import sys
from BaseHandler import BaseHandler

all_plugins = {}

def load_plugins():
    plugin_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),"Handlers")
    plugin_files = [x[:-3] for x in os.listdir(plugin_dir) if x.endswith(".py")]
    sys.path.insert(0,plugin_dir)
    for plugin in plugin_files:
        mod = __import__(plugin)
    logging.info('Plugins have been loaded from the directory '+plugin_dir)
    for plugin in BaseHandler.__subclasses__():
        logging.info('Plugin:'+plugin.__name__)    
    return BaseHandler.__subclasses__()

logging.basicConfig(level=logging.DEBUG)
loadedPlugins = load_plugins()

for plugin in loadedPlugins:
    all_plugins[plugin.__name__]= plugin.__class__
    handle = all_plugins[plugin.__name__]()

スクリプトの最後の行でプラグインの実際のオブジェクトを作成しようとすると

    handle = all_plugins[plugin.__name__]()

エラーが発生しますTypeError: __new__() takes exactly 4 arguments (1 given)

編集:完全なトレースバックを追加

Traceback (most recent call last):
   File "C:\TestCopy\Test.py", line 24, in <
module>
    handle = all_plugins[plugin.__name__]()
TypeError: __new__() takes exactly 4 arguments (1 given)
4

1 に答える 1

1

プラグイン自体ではなく、メタ クラスを登録しています。

>>> BaseHandler()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class BaseHandler with abstract methods start

プラグイン自体を保存するつもりだったと思います:

all_plugins[plugin.__name__] = plugin

代わりに、__class__属性はBaseHandlerクラスです。pluginオブジェクトはインスタンスではなくクラスです。

于 2013-02-18T10:27:15.597 に答える