日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2024/9/27 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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....的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。