[英]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.