【发布时间】:2023-03-02 22:30:01
【问题描述】:
我有一个用 C++ 定义的 Event 类,我使用 Boost 向 Python 公开。我的脚本应该从这个类派生,我想在定义新的子类时进行一些初始化。
如何设置暴露的Event 类的元类,以便每当 Python 脚本派生自此类时,元类都可以进行所需的初始化?
我想避免在脚本中显式使用元类...
class KeyboardEvent(Event): # This is what I want
pass
class KeyboardEvent(Event, metaclass=EventMeta): # This is not a good solution
pass
编辑: 部分解决方案
似乎没有办法用 Boost.Python 设置元类。下一个最好的事情是在定义类之后即兴创作和更改元类。在原生 Python 中,the safe way 更改元类就是这样做:
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
在 Boost 中,它看起来像这样:
BOOST_PYTHON_MODULE(event)
{
using namespace boost::python;
using boost::python::objects::add_to_namespace;
class_<EventMetaClass> eventmeta("__EventMetaClass")
...;
class_<Event> event("Event")
...;
add_to_namespace(scope(), "Event",
eventmeta(event["__name__"], event["__bases__"], event["__dict__"]));
}
问题是我似乎找不到用 Boost.Python 定义元类的方法,这就是我打开 How to define a Python metaclass with Boost.Python? 的原因。
【问题讨论】:
-
可能是
class EventWithMeta(Event, metaclass=EventMeta):pass,然后是class KeyboardEvent(EventWithMeta); class AnotherEvent(EventWithMeta)? -
@reclosedev 不。问题不在于我输入“元类”这个词。元类的需求是一个实现细节,不应该泄漏到暴露给脚本的接口。
-
也许我遗漏了一些东西,但在这种情况下,
Event可以重命名为_Event或类似的东西,EventWithMeta可以重命名为Event。 -
@reclosedev 这是一个显而易见的解决方案,但在我的情况下它有很多缺点。
-
更改类的元类与更改实例的类一样有意义,即您可以这样做,但很少会产生任何可用的东西。按照 reclosedev 建议的方式进行操作有哪些缺点?
标签: c++ python boost-python metaclass