首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pyo3中编写类?

如何在pyo3中编写类?
EN

Stack Overflow用户
提问于 2021-05-26 19:02:50
回答 1查看 324关注 0票数 3

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

代码语言:javascript
复制
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之后失败。

代码语言:javascript
复制
import pyo3test as po3

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

如何修改锈蚀代码,使其维护对Store实例的引用?我认为它可能需要使用PyCell,但我不确定。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-26 22:12:08

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

代码语言:javascript
复制
#[pyclass]
struct MyClass {
    #[pyo3(get, set)]
    store: Py<Store>,
}

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

通过这些更改,您的断言将传递给我,并且两个Store的地址相同:

代码语言:javascript
复制
>>> mystore = po3.Store(7)
>>> myobj = po3.MyClass(mystore)
>>> assert(myobj.store is mystore)
>>> mystore
  <Store at 0x7f3a726bc590>
>>> myobj.store
  <Store at 0x7f3a726bc590>
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67711215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档