用Python修补的SIP包装的C类
我正在一些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 包装库包含包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类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |