Python 如何修复此元类承载的类型错误?
我正在尝试创建一个简单的动态插件系统,其中从类Python 如何修复此元类承载的类型错误?,python,plugins,typeerror,metaclass,Python,Plugins,Typeerror,Metaclass,我正在尝试创建一个简单的动态插件系统,其中从类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_re
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'
()
19
20
--->21类机器人(对象):
22“Knacki机器人程序的基类”
23类\元类\类型:
in_uuuinit_uuuuu(cls、名称、基数、dict)
23类\元类\类型:
24定义初始值(cls、名称、基数、dict):
--->25类型。初始化(名称、基、指令)
26反应堆_bot_注册表[名称]=cls
27
TypeError:调用元类基时出错
描述符“\uuuu init\uuuuuu”需要一个“type”对象,但收到一个“str”
我做错了什么?
type.\uuuu init\uuuuu
与您的元类具有相同的调用签名。\uuuuu init\uuuuu
。第一个参数应该是cls
:
type.__init__(cls, name, bases, dict)
顺便说一句:不要给变量命名dict
,因为它会隐藏相同名称的内置项。我建议
type.__init__(cls, name, bases, clsdict)