클래스 A
, B
및 C
이 있다고 해봅시다.MRO 오류없이 기본 클래스로 mixin을 어떻게 동적으로 추가합니까?
클래스 A
및 B
은 모두 C
클래스의 믹스 인 클래스입니다.
class A(object):
pass
class B(object):
pass
class C(object, A, B):
pass
이
클래스 C를 인스턴스화 할 때 나는 그것이 작동하도록 클래스 C에서object
을 제거해야 작동하지 않습니다. (그렇지 않으면 MRO 문제가 생길 것입니다.)
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases B, object, A
그러나 제 경우는 좀 더 복잡합니다. 내 경우에 클래스 C
은 서버입니다. 여기서 A
및 B
은 시작할 때로드되는 플러그인입니다. 이들은 자신의 폴더에 있습니다.
또한 Cfactory
이라는 클래스가 있습니다. Cfactory에서 나는 그래서 다음은 가능성이, 내가 플러그인에 대한 검색 __new__
방법에서 완전한 기능 오브젝트 C를 만들 __import__
를 사용하여로드 한 다음 C.__bases__ += (loadedClassTypeGoesHere,)
에 할당하는 __new__
방법이 있습니다 (가) 매우 추상적
class A(object):
def __init__(self): pass
def printA(self): print "A"
class B(object):
def __init__(self): pass
def printB(self): print "B"
class C(object):
def __init__(self): pass
class Cfactory(object):
def __new__(cls):
C.__bases__ += (A,)
C.__bases__ += (B,)
return C()
이 다시 작동하지 않습니다, 다시 MRO 오류를 줄 것이다 만든 :
TypeError: Cannot create a consistent method resolution
order (MRO) for bases object, A
이것에 대한 쉬운 수정 A
및 B
에서 object
baseclass를 제거하는 것입니다. (가능해야하는 유닛 테스트는 현명한)
또 다른 쉽게 수정 C
에서 object
을 제거하고 그러나이 이러한 플러그인은 독립 실행 될 때 피해야 그 이전 스타일의 객체를 만들 것입니다하지만,이 또한 그것에게 만들 것 예전 스타일의 클래스와 C.__bases__
을 사용할 수 없으므로 추가 객체를베이스에 추가 할 수 없습니다. C
어떻게하면 좋을까요? 어떻게하면 좋을까요? 지금은 플러그인에 대한 구식 클래스로 살 수 있습니다. 하지만 나는 그들을 사용하지 않습니다.
파이썬 3에서는 구식 클래스가 존재하지 않으므로 결국 해결책이 필요하다. –
정말로 사실입니다. –