0

我正在尝试创建一个简单的动态插件系统,其中从类继承的插件Bot在导入时自动注册。

到目前为止,以下是我的代码。请注意,我正在撰写这篇短文。

import os.path as osp
from glob import glob
from imp import load_source

from twisted.internet import reactor

run = reactor.run
halt = reactor.stop


class Reactor(object):
    _bot_registry = {}

    def __init__(self, botdir):
        map(load_source, *enumerate(glob(osp.join(botdir, '../bots/*.py'))))
        self.bots = {k: v() for k, v in self._bot_registry.iteritems()}


class Bot(object):
    """Base class for Bots"""
    class __metaclass__(type):
        def __init__(cls, name, bases, dict):
            type.__init__(name, bases, dict)
            Reactor._bot_registry[name] = cls

    def _update(self):
        """Run through one scrape/process/respond iteration."""
        pass

    def scrape(self):
        pass

    def process(self):
        pass

    def publish(self):
        pass

导入上面的代码时,我得到一个 TypeError 如下:

TypeError                                 Traceback (most recent call last) <ipython-input-42-dc3963f5e69b> in <module>()
     19 
     20 
---> 21 class Bot(object):
     22     """Base class for Knacki Bots"""
     23     class __metaclass__(type):

<ipython-input-42-dc3963f5e69b> in __init__(cls, name, bases, dict)
     23     class __metaclass__(type):
     24         def __init__(cls, name, bases, dict):
---> 25             type.__init__(name, bases, dict)
     26             Reactor._bot_registry[name] = cls
     27 

TypeError: Error when calling the metaclass bases
    descriptor '__init__' requires a 'type' object but received a 'str'

我做错了什么?

4

1 回答 1

2

type.__init__与您的 . 具有相同的呼叫签名metaclass.__init__。第一个论点应该是cls

type.__init__(cls, name, bases, dict)

顺便说一句:永远不要命名变量dict,因为它会影响同名的内置函数。我建议

type.__init__(cls, name, bases, clsdict)
于 2013-05-13T19:08:23.587 回答