2

特定の C++ クラスに登録されている boost::python::class_ オブジェクトにアクセスするにはどうすればよいですか? boost::property_tree::ptree のラッパーを定義する boost::python モジュールをインポートしていますが、このラッパー定義にメソッドを追加したいと考えています。新しいラッパーを作成しようとすると、Boost Python はハンドラーが既に宣言されていると文句を言い、新しい定義を無視します。

何か案は?

4

2 に答える 2

3

daramarakの提案と、Boost Pythonチュートリアルの「ラップされたオブジェクトの拡張」に続いて、Python内からクラスを拡張しました。Python、つまりBoost :: Pythonは、バインドされたメンバー関数と、最初の引数がオブジェクト参照(またはポインター)である関数をほとんど区別しません。したがって、次のようにC++で関数を定義できます。

bool ptree__contains(boost::property_tree::ptree* self, const std::string& key) {
    return self->find(key)!=self->not_found();
}

そして、Pythonでインポートされたクラスを次のように拡張します。

from other_module import ptree
from my_module import ptree__contains

# The __contains__ method is a special api function 
# that enables "foo in bar" boolean test statements
ptree.__contains__ = ptree__contains

test_ptree = ptree()
test_ptree.put("follow.the.yellow.brick.road", "OZ!")

print "follow.the.yellow.brick.road" in test_ptree
# > true

モジュールのに拡張コードを追加して__init__.py、モジュールをインポートすると、目的のメソッドが外部オブジェクトに自動的に追加されるようにしました。クラスを変更する関数を定義し、この関数を呼び出してから、名前空間をクリーンアップするために削除しました。または、この関数をリストから除外して、ステートメント__all__によってエクスポートされないようにすることもできます。from module import *チャームのように機能します!再びdaramarakに感謝します。

于 2013-02-07T04:11:21.877 に答える