Description
Hi,
I am trying to register a class that has an abstract method. The idea is for clients to define the method in their subclasses. However, the registration fails.
Before I forget, I am running on Ubuntu 16.04, using pybind11 version 2.2.2, python 2.7.12, g++ version 5.4.0, and -std=c++11.
Here is what I am trying to do:
py::module abc = py::module::import("abc");
py::object abc_meta = abc.attr("ABCMeta");
py::object abstract = abc.attr("abstractmethod");
py::module mod{"example"};
py::class_<Base> base(mod, "Base", py::metaclass(abc_meta));
base.def("draw", &Base::draw, "Abstract method that subclasses must define");
base.attr("draw") = abstract(base.attr("draw"));
base.def("save", &Base::save, "Save into file");
Here, I have a class that offers the save() function. But I require clients to create a subclass and define the draw() function.
When I compile and run the code, I get the following error:
terminate called after throwing an instance of 'pybind11::error_already_set'
what(): AttributeError: type object 'example.Base' has no attribute '_abc_cache'
At:
/usr/lib/python2.7/abc.py(151): __subclasscheck__
Since ABCMeta is trying to add _abc_cache and other attributes to my base class, I thought adding dynamic_attr() might help. I get the same error message with the following:
py::class_<Base> base(mod, "Base", py::metaclass(abc_meta), py::dynamic_attr());
I would appreciate any help on this. Thank you.
In the attached file, I am embedding the python interpreter so that I do not need a python script to import my example module.
main.cpp.txt