下面是我解决这个问题的工作方案。它使用了上述“无所不能”和“柔印”的建议。

特别是,我们用SWIG director创建一个回调类,然后在Python中从中派生出所需的回调功能,而不引入循环依赖项。

此外,我们还提供了一个接口,允许任何可调用的Python对象充当回调函数。我们通过在SWIG中使用“pythonprend”指令为“setCallback”函数添加一些代码来实现这一点。这段代码只是检查一个可调用的对象,如果它找到了一个对象,则将其包装在回调的实例中。

最后,我们处理与C++类(ObjutPyCalBub)引用相关的内存问题,即引用对象(即回调子类)。

文件example.py:import cb

class CB(cb.Callback):

def __init__(self):

super(CB, self).__init__()

def call(self, x):

print("Hello from CB!")

print(x)

def foo(x):

print("Hello from foo!")

print(x)

class Bar:

def __call__(self, x):

print("Hello from Bar!")

print(x)

o = cb.ObjWithPyCallback()

mycb=CB()

o.setCallback(mycb)

o.call()

o.setCallback(foo)

o.call()

o.setCallback(Bar())

o.call()

文件ObjWithPyCallback.i:%module(directors="1") cb

%{

#include "Callback.h"

#include "ObjWithPyCallback.h"

%}

%feature("director") Callback;

%feature("nodirector") ObjWithPyCallback;

%feature("pythonprepend") ObjWithPyCallback::setCallback(Callback&) %{

if len(args) == 1 and (not isinstance(args[0], Callback) and callable(args[0])):

class CallableWrapper(Callback):

def __init__(self, f):

super(CallableWrapper, self).__init__()

self.f_ = f

def call(self, obj):

self.f_(obj)

args = tuple([CallableWrapper(args[0])])

args[0].__disown__()

elif len(args) == 1 and isinstance(args[0], Callback):

args[0].__disown__()

%}

%include "Callback.h"

%include "ObjWithPyCallback.h"

文件回调.h:#ifndef CALLBACK_H

#define CALLBACK_H

class ObjWithPyCallback;

class Callback

{

public:

Callback(){}

virtual ~Callback(){}

virtual void call(ObjWithPyCallback& object){}

};

#endif

文件ObjWithPyCallback.h:#ifndef OBJWITHPYCALLBACK_H

#define OBJWITHPYCALLBACK_H

class Callback;

class ObjWithPyCallback

{

public:

ObjWithPyCallback();

~ObjWithPyCallback();

void setCallback(Callback &callback);

void call();

private:

Callback* callback_;

};

#endif

文件ObjWithPyCallback.cpp:#include "ObjWithPyCallback.h"

#include "Callback.h"

#include

ObjWithPyCallback::ObjWithPyCallback() : callback_(NULL) {}

ObjWithPyCallback::~ObjWithPyCallback()

{

}

void ObjWithPyCallback::setCallback(Callback &callback)

{

callback_ = &callback;

}

void ObjWithPyCallback::call()

{

if ( ! callback_ )

{

std::cerr << "No callback is set.\n";

}

else

{

callback_->call(*this);

}

}

python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....相关推荐

  1. python @修饰符_数据结构与算法之8——抽象数据类型与python类

    就算你是特别聪明,也要学习,从头学起!--(俄国)屠格涅夫 本篇文章要说的主要是数据结构与算法和python中关于类(Class)以及异常(Error)的一些基础,虽然很简单,但是必须非常重视.只有在 ...

  2. python编写函数 avg(lst),参数 lst 是一个列表。函数可以返回 lst 的整数平均值,调用 avg(lst) 函数求每个学生的平均成绩。

    python编写函数 avg(lst),参数 lst 是一个列表.函数可以返回 lst 的整数平均值,调用 avg(lst) 函数求每个学生的平均成绩. 已知成绩列表 s={'小李':[77,54], ...

  3. 如何debug函数_如何使用 pdb 来性感 debug 你的 Python 代码?

    当你的代码写得多了,你总会出现这样或者那样的错误,有时候代码突然可以用,有时候代码又突然傻逼,有时候你只是离开一会,它就自动好了-就像女生的心思,总是让人捉摸不透,总是那么的魔幻. 今天,小帅b来跟你 ...

  4. python求定积分的函数_手搓计算化学(GTO积分by python)

    挤牙膏(1/∞) 完全基于Python的GTO积分库get√ scf因为惨不忍睹已经回炉重做( (用python不用c是因为还有其他后续工作,不能封装得连函数都看不到(不然怎么重载 代码还提供了积分值 ...

  5. python调用dll函数_关于从加载的DLL调用函数的Python基本问题

    我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...

  6. excel运行python自定义函数_终于,可以在Excel中直接使用Python!

    大家好,我是早起. 经常给大家推荐好用的数据分析工具,也收到了铁子们的各种好评.这次也不例外,我要再推荐一个,而且是个爆款神器. Excel和Jupyter Notebok都是我每天必用的工具,而且两 ...

  7. python agg函数_个人对Pandas中agg、apply和transform函数的理解

    个人对Pandas中agg.apply和transform函数的理解 学习<利用Python进行数据分析>一书,关于pandas的这三个函数,个人理解如下. agg agg方法可以被gro ...

  8. python回测函数_【手把手教你】动量指标的Python量化回测

    我认为投资专业的学生只需要两门教授得当的课堂:如何评估一家公司,以及如何考虑市场价格.--巴菲特 01 引言 本文延续"手把手教你使用Python的TA-Lib"系列,以资金流量指 ...

  9. python normalize函数_数据正规化 (data normalization) 的原理及实现 (Python sklearn)

    原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...

最新文章

  1. LeetCode简单题之在长度 2N 的数组中找出重复 N 次的元素
  2. /dev/rdsk 与 /dev/dsk区别
  3. 安卓项目查手机电量功能_不做低头族,一键开启手机上的这一功能,手机信息随时查...
  4. 拆解一个舵机组成的机器人
  5. python转cython_用Cython加速Python到“起飞”(推荐)
  6. 【dp】noip2000提高组 乘积最大
  7. php连接mysql_PHP连接MySQL数据库的三种方式
  8. 2020身高体重标准表儿童_男女孩最新身高标准表,你家孩子达标了吗?(附增高秘籍)...
  9. Java中的反射和Java中的访问修饰符
  10. Python 炫技操作:花式导包的八种方法
  11. 微软拿 480 亿买 GitHub 就为了拥抱开源?
  12. ASP.NET学习顺序(转摘)
  13. 情感计算在淘宝UGC的应用
  14. Linux网络属性及其配置
  15. 华为 HG255D 刷openwrt trunk 支持ipv6
  16. JVM调优-JVM调优实践一
  17. 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
  18. 面板数据,面板数据的三种基本模型
  19. 免费申请国外免费域名超详细教程
  20. 用什么软件测试内存条稳定,使用内存条检测工具监测内存稳定性,内存条检测工具有哪些...

热门文章

  1. boost::sort模块实现Spinsort算法的测试程序
  2. boost::range_reference相关的测试程序
  3. boost::hana::deque用法的测试程序
  4. boost::hana::has_common用法的测试程序
  5. VTK:PolyData之ClosedSurface
  6. OpenCV平面跟踪planar tracking的实例(附完整代码)
  7. OpenCV背景减法Background Subtraction Methods
  8. Qt Creator Qt快速最佳实践
  9. C语言Stock span 库存跨度问题(附完整源码)
  10. OpenGL Subdivision Modes细分模式的实例