如何在 pyo3 中编写 类?
How to compose classes in pyo3?
我正在使用最新版本的 pyo3(主分支),我不清楚如何存储 class 的实例,在下面的示例中说 Store
,在另一个 class。例如,下面的代码由两个 class 组成,Store
和 MyClass
并且会在一定程度上起作用。
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 }
}
}
但是,当这些 class 用于以下示例中的 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>
我正在使用最新版本的 pyo3(主分支),我不清楚如何存储 class 的实例,在下面的示例中说 Store
,在另一个 class。例如,下面的代码由两个 class 组成,Store
和 MyClass
并且会在一定程度上起作用。
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 }
}
}
但是,当这些 class 用于以下示例中的 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>