欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

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

发布时间:2024/9/27 python 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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....的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。