从 boost-python 包装工厂创建派生的 class
Create a derived class from a boost-python wrapped factory
在 C++ 库中,我有一个 class 带有私有构造函数和一个工厂:
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
。
当然,我可以创建一个 class,它不是从 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)
问题:有没有办法让MyEnhancedServer的MyServer.create()
的结果变成'base instance'?
结果会是这样的:
class MyEnhancedServer(MyServer):
def __init__(self, config):
self.MyServer = MyServer.create()
def another_method(self):
do(something)
一位同事告诉我该怎么做,但 post 没有回答。诀窍是实现 __new__()
并使用这个很酷的魔法设置实例' class:
class MyEnhancedServer(MyServer):
def __new__(cls, config):
self = cls.create(config)
self.__class__ = cls.__class__(cls.__name__, (cls, ), {})
return self
在 C++ 库中,我有一个 class 带有私有构造函数和一个工厂:
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
。
当然,我可以创建一个 class,它不是从 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)
问题:有没有办法让MyEnhancedServer的MyServer.create()
的结果变成'base instance'?
结果会是这样的:
class MyEnhancedServer(MyServer):
def __init__(self, config):
self.MyServer = MyServer.create()
def another_method(self):
do(something)
一位同事告诉我该怎么做,但 post 没有回答。诀窍是实现 __new__()
并使用这个很酷的魔法设置实例' class:
class MyEnhancedServer(MyServer):
def __new__(cls, config):
self = cls.create(config)
self.__class__ = cls.__class__(cls.__name__, (cls, ), {})
return self