【问题标题】:Create a derived class from a boost-python wrapped factory从 boost-python 包装的工厂创建派生类
【发布时间】:2018-05-20 13:37:42
【问题描述】:

在 C++ 库中,我有一个带有私有构造函数和工厂的类:

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

通过 boost-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)

但这当然行不通,因为我不能直接实例化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)

【问题讨论】:

    标签: python c++ factory boost-python derived-class


    【解决方案1】:

    一位同事告诉我该怎么做,但没有发布答案。诀窍是实现__new__() 并用这个很酷的魔法设置实例的类:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多