用Python修补的SIP包中的C++类

2024-04-19 11:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一些C++库上创建了一个Python包装器,实现了一些低级别的M2M通信。我在使用Riverbank的SIP包装器生成器。在

C++类有一个方法:

class Bar {
public:
    enum Status {
        ...
    };
    void setStatus(Status s);
    Status getStatus() const;
    ...
};

类包含在模块foo中。在

SIP使用它自己的枚举类型,但是出于一些原因,我希望使用标准库中的python3.4enum。在

我看不到有任何机会从pythoncapi访问Python定义的类,所以我决定在__init__.py中修补包装好的类。主要原因是我想在C/C++ +SIP中做脏的低级工作,并用Python来抛光类(比如用错误的消息添加参数验证)。在

Python__init__.py部分如下(或多或少):

^{pr2}$

Bar.status将接受并返回nice,pythonicBar.Status枚举。在

预期结果如下:

class Bar(object):
    class Status(IntEnum):
         ...
    ...

我想知道这种方法是否有什么问题,尤其是在导入时修补对象。在


Tags: 方法pyinitstatusbar原因enumpublic
1条回答
网友
1楼 · 发布于 2024-04-19 11:22:00

我用其他似乎没问题的方法解决了这个问题。在

让我们考虑一个C++库,包含两个类:

  1. 食品工厂

包装器库包含包libfoo(用pythoncapi创建)和pythonic包foo(用普通Python创建)。我们不直接访问libfoo包,而是导入foo。在

foo__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,)

现在,当我在消息来源的任何地方这样做:

^{pr2}$

这样,我可以用Python API糖来代替非Pythic C++类。在

相关问题 更多 >