首页 > 解决方案 > 在创建 Python 类时,如何在 Rust 中使用 pyo3 创建析构函数方法?

问题描述

我在 Rust 中使用 pyo3 来创建 Python 模块。我可以创建一个类和一个构造函数:

    #[pyclass]
    struct MyClass {
        i: u8,
    }

    #[pymethods]
    impl MyClass {
        #[new]
        fn new() -> PyResult<Self> {
            println!("Instance Constructed!");
            Ok(MyClass { i: 0 })
        }

        // Doesn't work
        fn __del__(&mut self) {
            println!("Instance destroyed");
        }
    }

    #[pymodule]
    fn myclass(_py: Python, m: &PyModule) -> PyResult<()> {
        m.add_class::<MyClass>()?;
        Ok(())
    }

当我编译它并使用 Python 中的类时,我可以看到我的实例有一个__del__方法,我可以手动调用它,但是当实例被销毁时 Python 不会调用它:

>>> from myclass import MyClass
>>> inst = MyClass()
Instance Constructed!
>>> inst.__del__
<built-in method __del__ of builtins.MyClass object at 0x766ca4c0>
>>> inst.__del__()
Instance destroyed
>>> del(inst)
>>>

有没有一种特殊的方法可以使用 pyo3 在 Rust 中创建析构函数?为什么 Python 不调用__del__del当您实例化时,为纯 Python 中定义的类调用它似乎没有问题。

标签: pythonrustpyo3

解决方案


推荐阅读