加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用Python修补的SIP包装的C类

发布时间:2020-12-20 13:42:19 所属栏目:Python 来源:网络整理
导读:我正在一些C库上创建一个 Python包装器,实现一些低级别的M2M通信.我正在使用Riverbank的SIP包装器生成器. C类有一个方法: class Bar {public: enum Status { ... }; void setStatus(Status s); Status getStatus() const; ...}; 该类包含在模块foo中. SIP使
我正在一些C库上创建一个 Python包装器,实现一些低级别的M2M通信.我正在使用Riverbank的SIP包装器生成器.

C类有一个方法:

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

该类包含在模块foo中.

SIP使用它自己的枚举类型,但由于一些原因,我想使用标准库中的Python 3.4枚举.

我没有看到任何从Python C API访问Python定义的类的机会,我决定在__init__.py中修补包装类.主要原因是我想在C/C++ / SIP中进行脏的低级工作,并在Python中修改类(比如使用合理的错误消息添加参数验证).

Python __init__.py部分看起来像这样(或多或少):

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枚举.

预期结果是这样的:

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

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

解决方法

我用其他似乎没问题的方式解决了这个问题.

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

> Foo
> FooFactory

包装库包含包libfoo(在Python C API中创建)和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,)

现在,在源代码中的任何地方我这样做:

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 API糖来抛光相当不同于pythonic的C类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读