docs/cpp/source/api/library/custom_classes.md
PyTorch allows registering custom C++ classes that can be used from Python and TorchScript.
Header: torch/custom_class.h
:members:
:undoc-members:
Example:
#include <torch/custom_class.h>
struct MyClass : torch::CustomClassHolder {
int value;
MyClass(int v) : value(v) {}
int getValue() const { return value; }
void setValue(int v) { value = v; }
};
TORCH_LIBRARY(my_classes, m) {
m.class_<MyClass>("MyClass")
.def(torch::init<int>())
.def("getValue", &MyClass::getValue)
.def("setValue", &MyClass::setValue)
.def_readwrite("value", &MyClass::value);
}
Constructor:
m.class_<MyClass>("MyClass")
.def(torch::init<int>()) // Constructor taking int
Methods:
m.class_<MyClass>("MyClass")
.def("getValue", &MyClass::getValue)
.def("setValue", &MyClass::setValue)
Properties:
m.class_<MyClass>("MyClass")
.def_readwrite("value", &MyClass::value) // Read-write
.def_readonly("const_value", &MyClass::const_value) // Read-only
From C++:
auto my_obj = c10::make_intrusive<MyClass>(42);
int val = my_obj->getValue();
From Python:
import torch
torch.classes.load_library("path/to/library.so")
obj = torch.classes.my_classes.MyClass(42)
print(obj.getValue())
In TorchScript:
@torch.jit.script
def use_my_class(x: torch.classes.my_classes.MyClass) -> int:
return x.getValue()