2017-12-06 36 views
0

포장 :가 부스트 - 파이썬에서 파생 클래스를 만듭니다 내가 개인 생성자를 가진 클래스와 공장이 C++ 라이브러리에서 공장

class MyServer { 
    MyServer() {..}; 
    public: 
    MyServer create(std::string &config); 
}; 

부스트 파이썬을 나는 날이 팩토리를 사용할 수있는 랩퍼를 작성 :

from MyWrappedLibrary import MyServer, StartServer 
server = MyServer.create('some: magic, config: string') 
StartServer(server) 

지금 나는이 같은 MYSERVER하는 방법을 추가 할 :

from MyWrappedLibrary import MyServer, StartServer 

class MyEnhancedServer(MyServer): 
    def __init__(self, config): 
     super().__init__(config) 

    def another_method(self): 
     do(something) 

그러나 코스 t의 MyServer을 직접 인스턴스화 할 수 없기 때문에 그의 작품이 작동하지 않습니다. 물론

내가 MyServer에서 파생되지 않은 클래스를 만들 수 있지만 모든 방법을 포장했다 이후는 기분이 좋지 것 :

class MyEnhancedServer: 
    def __init__(self, config): 
     self.core_instance = MyServer.create(config) 

    def foo_1(self): # wrapper 
     self.core_instance.foo_1() 

    def foo_2(self): # wrapper 
     return self.core_instance.foo_2() 

    def another_method(self): 
     do(something) 

server = MyEnhancedServer('some: magic, config: string') 
StartServer(server.core_instance) 

질문 :을 만들 수있는 방법이 있나요 MyServer.create()의 결과는 MyEnhancedServer의 '기본 인스턴스'입니까?

class MyEnhancedServer(MyServer): 
    def __init__(self, config): 
     self.MyServer = MyServer.create() 

    def another_method(self): 
     do(something) 

답변

0

가 동료가 그것을 어떻게 얘기하지만 대답을 게시하지 것이다 :

결과는 다음과 같이 될 것이다. 트릭은 __new__()을 구현하고이 멋진 마술로 인스턴스 '클래스를 설정하는 것입니다.

class MyEnhancedServer(MyServer): 
    def __new__(cls, config): 
     self = cls.create(config) 
     self.__class__ = cls.__class__(cls.__name__, (cls,), {}) 
     return self