78 lines
1.6 KiB
Rust
78 lines
1.6 KiB
Rust
|
#![cfg(feature = "multiple-pymethods")]
|
||
|
|
||
|
use pyo3::prelude::*;
|
||
|
use pyo3::type_object::PyTypeObject;
|
||
|
use pyo3::types::PyType;
|
||
|
|
||
|
#[macro_use]
|
||
|
mod common;
|
||
|
|
||
|
#[pyclass]
|
||
|
struct PyClassWithMultiplePyMethods {}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[new]
|
||
|
fn new() -> Self {
|
||
|
Self {}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[call]
|
||
|
fn call(&self) -> &'static str {
|
||
|
"call"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
fn method(&self) -> &'static str {
|
||
|
"method"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[classmethod]
|
||
|
fn classmethod(_ty: &PyType) -> &'static str {
|
||
|
"classmethod"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[staticmethod]
|
||
|
fn staticmethod() -> &'static str {
|
||
|
"staticmethod"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[classattr]
|
||
|
fn class_attribute() -> &'static str {
|
||
|
"class_attribute"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl PyClassWithMultiplePyMethods {
|
||
|
#[classattr]
|
||
|
const CLASS_ATTRIBUTE: &'static str = "CLASS_ATTRIBUTE";
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn test_class_with_multiple_pymethods() {
|
||
|
Python::with_gil(|py| {
|
||
|
let cls = PyClassWithMultiplePyMethods::type_object(py);
|
||
|
py_assert!(py, cls, "cls()() == 'call'");
|
||
|
py_assert!(py, cls, "cls().method() == 'method'");
|
||
|
py_assert!(py, cls, "cls.classmethod() == 'classmethod'");
|
||
|
py_assert!(py, cls, "cls.staticmethod() == 'staticmethod'");
|
||
|
py_assert!(py, cls, "cls.class_attribute == 'class_attribute'");
|
||
|
py_assert!(py, cls, "cls.CLASS_ATTRIBUTE == 'CLASS_ATTRIBUTE'");
|
||
|
})
|
||
|
}
|