我正在一些C++库上创建一个Python包装器,实现一些低级别的M2M通信。我在使用Riverbank的SIP包装生成器。
C++类有一个方法:
class Bar {
public:
enum Status {
...
};
void setStatus(Status s);
Status getStatus() const;
...
};类包含在模块foo中。
SIP正在使用它自己的枚举类型,但出于几个原因,我想使用标准libray中的Python3.4枚举。
我没有机会从Python中访问Python定义的类,所以我决定在__init__.py中修补包装类。主要原因是我想在C/C++/SIP中做一些低级的工作,并在Python中修饰类(比如用正确的错误消息添加参数验证)。
Python部件看起来如下(或多或少):
from foo import Bar
class Status(IntEnum):
ONE = 1
TWO = 2
... and so on ...
Status.__module__ = 'Bar.Status'
Bar.Status = Status
Bar.status = property(...)Bar.status将接受并返回好的,pythonic Bar.Status enum。
预期结果如下所示:
class Bar(object):
class Status(IntEnum):
...
...我想知道这种方法是否有什么问题,特别是在导入时修补对象。
发布于 2014-05-08 21:21:09
我用其他方法解决了这个问题,这似乎没什么问题。
让我们考虑一个包含两个类的C++库:
包装器库包含包libfoo (用pythonic创建)和pythonic包foo (用普通Python创建)。我们不直接访问libfoo包,而是导入foo。
包装foo's __init__.py
from libfoo import Foo, FooFactory
# both are naked wrappers with ugly API derived from C++
# I defined some pythonic sugar that makes them nice to use
class FooPythonicGoodies(object):
# add pythonic goodies here
def quack(self):
pass
# Merge them
Foo.__bases__ = Foo.__bases__ + (FooPythonicGoodies,)现在,当我在消息来源中的任何地方这样做时:
from foo import Foo, FooFactory
a = Foo()
a.quack()
# Factory is a C++ wrapped class that returns wrapped foo
# objects WITH FooPythonicGoodies!
factory = FooFactory()
b = factory.create_foo()
b.quack() # that works too!这样,我就可以用pythonic糖来修饰相当非pythonic的C++类。
https://stackoverflow.com/questions/23460396
复制相似问题