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....的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花旗银行信用卡分期业务介绍 分期付款交易
- 下一篇: js判断是否为数字_第23题:JavaS