私はEvent
クラスをC++で定義しており、Boostを使ってPythonに公開しています。私のスクリプトはこのクラスから派生することが期待されています。新しい子クラスが定義されるたびに初期化を行いたいと思います。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でメタクラスを設定します。次善策は、クラスが定義された後にメタクラスを即興して変更することです。 、それは次のようになりたいブーストで
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
:ネイティブPythonでは、the safe wayはメタクラスがこれを行うことです変更する
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__"]));
}
問題は、私が見つけるように見えることができないということです私がHow to define a Python metaclass with Boost.Python?をオープンした理由は、Boost.Pythonでメタクラスを定義する方法です。
多分 'class EventWithMeta(Event、metaclass = EventMeta):pass'それから' class KeyboardEvent(EventWithMeta);クラスAnotherEvent(EventWithMeta) '? – reclosedev
@reclosedevいいえ、問題は私が「メタクラス」という言葉をタイプすることではありません。メタクラスの必要性は、スクリプトに公開されたインターフェースに漏れてはならない実装の詳細です。 –
たぶん私は何か不足しているかもしれませんが、この場合、 'Event'は' _Event'またはこれに似たものに、 'EventWithMeta'は' Event'に名前を変更できます。 – reclosedev