2013-02-18 43 views
1

我想实现一个基于插件的文件上传器,它可以上传文件到不同的服务。它从一个目录加载所有的python模块,然后根据要上传的服务调用它们。自定义ABC类:__new()__需要正好4个参数(1给出)

我有一个简单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) 

回答

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对象是类,而不是实例。

+0

尝试了您的建议。从对象继承后得到相同的错误 – Gokul 2013-02-18 10:34:10

+0

@Gokul:更新了答案;你正在注册错误的对象。 – 2013-02-18 10:43:31

+0

这很好。谢谢,但如果加载的插件文件有多个类会发生什么。我们如何创建特定类的对象 – Gokul 2013-02-18 10:49:28

相关问题