簡體   English   中英

如何在創建Python class時使用Rust中的pyo3創建析構函數方法?

[英]How can I create a destructor method using pyo3 in Rust when creating a Python class?

我在 Rust 中使用 pyo3 創建一個 Python 模塊。 我可以創建一個 class 和一個構造函數:

    #[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 中的 class 時,我可以看到我的實例有一個__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 中定義的 class 調用它似乎沒有問題。

當 Python object 被釋放時(在__del__之后,當在包裝器對象上調用tp_dealloc()槽時)底層的 Rust 結構將被刪除,因此如果您為該結構實現 trait Drop ,它應該按您預期的那樣被調用。

(我認為這是一個占位符答案,在原始問題的評論中捕獲信息。如果@Masklinn 想提供官方答案,我很樂意刪除它。我只是不想讓其他人在他們碰巧不閱讀時錯過這個信息評論。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM