首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >封装在C++中的in类

问封装在C++中的in类
EN

Stack Overflow用户
提问于 2014-05-04 19:09:49
回答 1查看 877关注 0票数 4

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

C++类有一个方法:

代码语言:javascript
复制
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部件看起来如下(或多或少):

代码语言:javascript
复制
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。

预期结果如下所示:

代码语言:javascript
复制
class Bar(object):
    class Status(IntEnum):
         ...
    ...

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 21:21:09

我用其他方法解决了这个问题,这似乎没什么问题。

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

  1. Foo
  2. FooFactory

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

包装foo's __init__.py

代码语言:javascript
复制
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,)

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

代码语言:javascript
复制
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++类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23460396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档