2012-01-27 7 views
5

私は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でメタクラスを定義する方法です。

+0

多分 'class EventWithMeta(Event、metaclass = EventMeta):pass'それから' class KeyboardEvent(EventWithMeta);クラスAnotherEvent(EventWithMeta) '? – reclosedev

+0

@reclosedevいいえ、問題は私が「メタクラス」という言葉をタイプすることではありません。メタクラスの必要性は、スクリプトに公開されたインターフェースに漏れてはならない実装の詳細です。 –

+0

たぶん私は何か不足しているかもしれませんが、この場合、 'Event'は' _Event'またはこれに似たものに、 'EventWithMeta'は' Event'に名前を変更できます。 – reclosedev

答えて

0

ブーストは、C++ withnからそれを行うための方法を提供していない、そしてそれがないように見える場合は、進むべき道は、メタクラスを実装するラッパークラスを作成することです -

それはより多くを行うことができますそれ以下で自動的に服従のビットを使用します。 Boostモジュールの名前が "event"であるとしましょう。ファイルを_eventとして指定するか、モジュール内に配置し、 "event.py"という名前のPythonファイル(または__init__.pyファイル以下、この:

import _event 

class eventmeta(type): 
    ... 

event_dict = globals() 
for key, value in _event.__dict__.items(): 
    if isinstance(value, type): 
     event_dict[key] = eventmeta(key, (value,),{}) 
    else: 
     #set other module members as members of this module 
     event_dict[key] = value 

del key, value, event_dict 

THOSのcpdeが自動的にネイティブ「_event」モジュールで見つかった任意の名前に等しいモジュール変数を設定します - と、検出した各クラスのために、あなたの例のように、メタクラスを変更する新しいクラスを作成します。

この場合、新しく作成されたクラスをネイティブクラスのプロキシにするには、適切な__getattribute__を作成して、メタクラスの競合が発生する可能性があります。 __setattr__方法。あなたがそれをする必要があるかどうかをコメントで尋ねるだけです。

+0

残念ながら、私はPythonでメタクラスを定義できません。初期化する必要があるのは、カスタムRTTIシステムをC++イベントとPythonイベントで動作させることです。私は十分なC++実装の詳細をPythonに公開することができるので、スクリプトは必要な初期化を行うことができますが、それは良い解決策ではありません。 –

関連する問題