Python ctypes,C++对象破坏

tau*_*ran 4 c++ python ctypes

考虑以下python ctypes - c ++绑定:

// C++
class A
{
public:
    void someFunc();
};

A* A_new() { return new A(); }
void A_someFunc(A* obj) { obj->someFunc(); }
void A_destruct(A* obj) { delete obj; }

# python
from ctypes import cdll

libA = cdll.LoadLibrary(some_path)

class A:
    def __init__(self):
        self.obj = libA.A_new()

    def some_func(self):
        libA.A_someFunc(self.obj)
Run Code Online (Sandbox Code Playgroud)

当不再需要python对象时,删除c ++对象的最佳方法是什么?

[edit]我添加了建议的删除功能,但问题仍然是由谁以及何时调用该函数.它应该尽可能方便.

Mar*_*tos 9

您可以实现该__del__方法,该方法调用您必须定义的析构函数:

C++

class A
{
public:
    void someFunc();
};

A* A_new() { return new A(); }
void delete_A(A* obj) { delete obj; }
void A_someFunc(A* obj) { obj->someFunc(); }
Run Code Online (Sandbox Code Playgroud)

蟒蛇

from ctypes import cdll

libA = cdll.LoadLibrary(some_path)

class A:
    def __init__(self):
        self.obj = libA.A_new()

    def __del__(self):
        libA.delete_A(self.obj)

    def some_func(self):
        libA.A_someFunc(self.obj)
Run Code Online (Sandbox Code Playgroud)

另请注意,您self__init__方法上省略了参数.

有人认为__del__是邪恶的.作为替代方案,您可以使用with语法:

class A:
    def __init__(self):
        self.obj = libA.A_new()

    def __enter__(self):
        return self

    def __exit__(self):
        libA.delete_A(self.obj)

    def some_func(self):
        libA.A_someFunc(self.obj)

with A() as a:
    # Do some work
    a.some_func()
Run Code Online (Sandbox Code Playgroud)