gpt4 book ai didi

python - 如何在 pyo3 中编写类(class)?

转载 作者:行者123 更新时间:2023-12-05 01:07:19 25 4
gpt4 key购买 nike

我正在使用最新版本的 pyo3(主分支),不清楚如何将一个类的实例存储在另一个类上,例如下面示例中的 Store。例如,下面的代码组成了两个类,StoreMyClass,并且会在一定程度上起作用。

use pyo3::prelude::*;

#[pyclass]
#[derive(Clone)]
struct Store {
#[pyo3(get, set)]
data: i32
}

#[pymethods]
impl Store {
#[new]
fn new(data: i32) -> Self {
Store{ data }
}
}

#[pyclass]
struct MyClass {
#[pyo3(get, set)]
store: Store,
}

#[pymethods]
impl MyClass {
#[new]
fn new(store: Store) -> Self {
MyClass{ store }
}
}

但是,当这些类在以下示例中的 Python 中使用时,由于克隆了 Store,因此断言失败。

import pyo3test as po3

mystore = po3.Store(7)
myobj = po3.MyClass(mystore)
assert(myobj.store is mystore)

如何修改 Rust 代码,使其保持对同一 Store 实例的引用?我认为它可能需要使用 PyCell,但我不确定。

谢谢!

最佳答案

如果您想在 MyClass 和 Python 中拥有相同的对象,则必须将 store 包装在 Py 中,即:

#[pyclass]
struct MyClass {
#[pyo3(get, set)]
store: Py<Store>,
}

#[pymethods]
impl MyClass {
#[new]
fn new(store: Py<Store>) -> Self {
MyClass { store }
}
}

通过这些更改,您的断言对我来说通过了,并且两个 Store 都生活在同一个地址:

>>> mystore = po3.Store(7)
>>> myobj = po3.MyClass(mystore)
>>> assert(myobj.store is mystore)
>>> mystore
<Store at 0x7f3a726bc590>
>>> myobj.store
<Store at 0x7f3a726bc590>

关于python - 如何在 pyo3 中编写类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67711215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com