2009-06-19 10 views
-3

동적으로 서브 클래스화할 수 있습니까? 나는 _____베이스가 있다는 것을 알고 있지만, 나는 그 클래스의 모든 경우에 영향을 미치기를 원하지 않는다. 개체 cf가 DrvCrystalfontz 클래스의 믹스 인으로 변형되기를 원합니다. 더 나아가 계층 구조에 신호를 연결하기 위해이 레벨에서 사용할 수 있어야하는 개체의 하위 클래스가 있으며 아래 솔루션으로는 충분하지 않습니다.파이썬에서 서브 클래 싱하기

class DrvCrystalfontz: 
    def __init__(self, model, visitor, obj=None, config=None): 
     if model not in Models.keys(): 
      error("Unknown Crystalfontz model %s" % model) 
      return 
     self.model = Models[model] 
     if self.model.protocol == 1: 
      cf = Protocol1(self, visitor, obj, config) 
     elif self.model.protocol == 2: 
      cf = Protocol2(self, visitor, obj, config) 
     elif self.model.protocol == 3: 
      cf = Protocol3(self, visitor, obj, config) 
     for key in cf.__dict__.keys(): 
      self.__dict__[key] = cf.__dict__[key] 
+0

유스 케이스를 조금 더 설명 할 수 있으며 위의 해결책이 효과가없는 이유는 무엇입니까? –

+4

원본 질문을 복원하십시오, 지금은 그것을 보지 못했던 누구에게나 완전히 쓸모가 없습니다. 자신의 질문에 대한 대답이있는 경우 _answer_! – nikow

답변

2

나는 내가 여기에 원하는 사용에 대한 명확한이야 잘 모르겠지만, 동적으로 서브 클래 싱 할 수 있습니다. 당신은 동적으로 이름이 주어진 클래스, 기본 클래스 및 방법의 DICT/클래스 속성의 튜플, 예를 구성하는 type 객체를 사용할 수 있습니다

>>> MySub = type("MySub", (DrvCrystalfontz, some_other_class), 
     {'some_extra method' : lamba self: do_something() }) 

MySub 지금 DrvCrystalfontzsome_other_class의 서브 클래스가 자신의 메소드를 상속된다, 새 것을 추가합니다 ("some_extra_method").

+0

필자는 확실히이 유형의 사용에 대해 알지 못했습니다. 포인터 주셔서 감사. – Scott