把安卓手机变成电脑外接屏:scrcpy 免费投屏与键鼠控制上手
2026/9/2 10:50:36
PyO3 是一个强大的库,允许我们在 Rust 中定义类并在 Python 中使用。本文将详细介绍 PyO3 类的各种特性和使用方法。
PyO3 允许定义原生 Rust 类型并在 Python 中将其作为类公开。
usepyo3::prelude::*;#[pyclass]structMyClass{num:i32,debug_buffer:String,}默认情况下,#[pyclass]类型只能从 Rust 代码实例化。要使其可从 Python 实例化,需添加构造函数。
#[pymethods]implMyClass{#[new]fnnew(num:i32)->Self{MyClass{num}}}当函数返回#[pyclass]类型时,会自动转换为 Python 对象。
#[pymethods]implMyClass{// 只读访问fnget_debug_buffer(slf:PyRef<Self>)->PyRef<String>{PyRef::map(slf,|this|&this.debug_buffer)}// 可变访问fnappend_to_debug_buffer(mutslf:PyRefMut<Self>,value:String)->PyResult<()>{slf.debug_buffer.push_str(&value);Ok(())}}#[pymethods]implMyClass{fn__del__(&self){println!("MyClass is being deallocated");}}通过extends参数让 Rust 类继承其他 Python 类:
#[pyclass(extends=PyException)]structMyError{#[pyo3(get, set)]value:i32,}#[pymethods]implMyError{#[new]fnnew(value:i32)->(Self,PyException){(MyError{value},PyException::new_err("Error occurred"))}}#[pyclass]支持多种配置选项:
name: 指定 Python 中的类名freelist: 优化内存分配weakref: 启用弱引用支持unsendable: 标记为非线程安全module: 指定所属模块#[pyclass(name ="MyCustomClass", freelist = 100, weakref, unsendable, module ="mymodule")]structMyClass{#[pyo3(get, set)]num:i32,}#[pyclass]不能有生命周期参数macro_rules!create_interface{($name:ident,$type:ty)=>{#[pyclass]pubstruct$name{inner:GenericClass<$type>,}#[pymethods]impl$name{#[new]pubfnnew(data:$type)->Self{Self{inner:GenericClass{data},}}}};}create_interface!(IntClass,i64);create_interface!(FloatClass,f64);#[pyclass]必须实现Send和Syncunsendable标记PyO3 在运行时进行借用检查,类似std::cell::RefCell<T>。
Py<T>和Bound<'py, T>在运行时跟踪引用来确保这些规则#[pyclass]structMyClass{#[pyo3(get, set)]num:i32,// 自动生成 getter 和 setter#[pyo3(get)]readonly_field:String,// 只读字段}i32,String等已满足要求Rc<RefCell<T>>等非线程安全类型PyO3 提供了一种优雅的方式来在 Rust 和 Python 之间建立互操作性,让我们能够充分利用两种语言的优势。通过掌握这些核心概念,我们可以在项目中有效地使用 PyO3 来构建高性能的 Python 扩展。
📚 更多 PyO3 相关内容,请参考官方文档