python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....
下面是我解决这个问题的工作方案。它使用了上述“无所不能”和“柔印”的建议。
特别是,我们用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....相关推荐
- python @修饰符_数据结构与算法之8——抽象数据类型与python类
就算你是特别聪明,也要学习,从头学起!--(俄国)屠格涅夫 本篇文章要说的主要是数据结构与算法和python中关于类(Class)以及异常(Error)的一些基础,虽然很简单,但是必须非常重视.只有在 ...
- python编写函数 avg(lst),参数 lst 是一个列表。函数可以返回 lst 的整数平均值,调用 avg(lst) 函数求每个学生的平均成绩。
python编写函数 avg(lst),参数 lst 是一个列表.函数可以返回 lst 的整数平均值,调用 avg(lst) 函数求每个学生的平均成绩. 已知成绩列表 s={'小李':[77,54], ...
- 如何debug函数_如何使用 pdb 来性感 debug 你的 Python 代码?
当你的代码写得多了,你总会出现这样或者那样的错误,有时候代码突然可以用,有时候代码又突然傻逼,有时候你只是离开一会,它就自动好了-就像女生的心思,总是让人捉摸不透,总是那么的魔幻. 今天,小帅b来跟你 ...
- python求定积分的函数_手搓计算化学(GTO积分by python)
挤牙膏(1/∞) 完全基于Python的GTO积分库get√ scf因为惨不忍睹已经回炉重做( (用python不用c是因为还有其他后续工作,不能封装得连函数都看不到(不然怎么重载 代码还提供了积分值 ...
- python调用dll函数_关于从加载的DLL调用函数的Python基本问题
我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...
- excel运行python自定义函数_终于,可以在Excel中直接使用Python!
大家好,我是早起. 经常给大家推荐好用的数据分析工具,也收到了铁子们的各种好评.这次也不例外,我要再推荐一个,而且是个爆款神器. Excel和Jupyter Notebok都是我每天必用的工具,而且两 ...
- python agg函数_个人对Pandas中agg、apply和transform函数的理解
个人对Pandas中agg.apply和transform函数的理解 学习<利用Python进行数据分析>一书,关于pandas的这三个函数,个人理解如下. agg agg方法可以被gro ...
- python回测函数_【手把手教你】动量指标的Python量化回测
我认为投资专业的学生只需要两门教授得当的课堂:如何评估一家公司,以及如何考虑市场价格.--巴菲特 01 引言 本文延续"手把手教你使用Python的TA-Lib"系列,以资金流量指 ...
- python normalize函数_数据正规化 (data normalization) 的原理及实现 (Python sklearn)
原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...
最新文章
- Qt-4.6.3移植与Qt creator开发环境建立
- 简述Python中的break和continue的区别
- keepalived 构建主备mysql
- 转载:VMware Workstation 无法连接到虚拟机。
- 浅谈分布式存储系统数据分布算法
- 滴滴、小米启动造车,特斯拉的护城河还能守多久?
- python自学行吗-自学入门Python能学会吗?
- tp3.2 页面trace使用
- 电工杯B题小代码分享
- XMAPP多端口配置
- 2019年安徽省学业水平考试计算机,2019年安徽省初中学业水平考试
- 广度优先搜索和深度优先搜索
- qt 实现PDF阅读器 (一)
- wordpress修复插件_如何修复WordPress中的“缺少临时文件夹”错误
- minio-operator部署minio服务,并用Java客户端访问minio
- 树莓派制作内网dns服务器,树莓派使用dnsmasq搭建DNS服务器
- Ubuntu系统备份还原教程
- 好用的待办事项APP有哪些
- Python wxpy 操作微信 大全集
- 微信授权与拒绝授权的弹窗处理
热门文章
- OpenCASCADE:形状愈合之形状加工
- BOOST_VMD_ASSERT_IS_IDENTIFIER宏相关的测试程序
- 2021-06-12
- boost::math模块计算二项式随机变量的概率和分位数的简单示例
- boost::two_graphs_common_spanning_trees用法的测试程序
- boost::fusion::single_view用法的测试程序
- Boost:boost::bimaps::unordered_multiset_of的测试程序
- DCMTK:测试图像像素模块功能
- DCMTK:测试衍生图像FG类
- VTK:Texture之TexturedSphere