2017-12-06 23 views
0

から派生クラスを作成します。私はプライベートコンストラクタと工場を持つクラスを持っているC++ライブラリではブースト-pythonのラップ工場

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

ブースト-pythonので、私は私がこのファクトリを使用することができますラッパーを作成:

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 
関連する問題