2013-05-13 1 views
0

클래스 Bot에서 상속 한 플러그인이 가져 오기시 자동으로 등록되는 간단한 동적 플러그인 시스템을 만들려고합니다.이 메타 클래스 기반 TypeError는 어떻게 수정합니까?

아래 코드는 지금까지입니다. 나는 this 짧은 논문에서 일하고 있음을 유의하십시오. 위의 코드를 가져 오는 경우

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         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' 
내가 잘못했을 무엇

?

답변

2

type.__init__의 전화 번호는 metaclass.__init__입니다. 첫 번째 인수는 cls해야한다 : 그런데

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

: 그것은 같은 이름의 내장 그림자 때문에, 변수 dict 이름을하지 마십시오. 나는 건의한다

type.__init__(cls, name, bases, clsdict) 
+0

실제로 당신은 정확하다. 나는 어리 석다. 최대한 빨리 받아 들일 것입니다! – blz