を使用して、いくつかの仮想関数を持つboost::python
クラス()をラップすることができましたNode
。これは大変なことでしたが、現在はクラスをオーバーライドしようとしていますsetattr/getattr
。自分の実装boost::python
を呼び出すsetattr
必要がありますが、発生する再帰を回避する方法がわかりません。
だから私はNode
クラスを持っています、そして私は書くことができるようになりたいです:
node1.param1 = 5 # Call node.SetParam
node1.plain_member = 7 # Call object.__setattr__
これまでのところ、私は(非常に要約して)持っています:
namespace bpy = boost::python;
struct NodeWrap : vcNode, bpy::wrapper<Node> {
...
static void setattr(bpy::object obj, std::string attr, bpy::object val)
{
NodeWrap const& node = bpy::extract<NodeWrap const&>(obj)();
ParamRef p = node.FindParam(attr);
if (p)
py_to_param(p, val); //This part works fine
else
{
obj.attr(attr) = val; //Problematic line - recurses indefinitely
}
}
};
次に、BOOST_PYTHON_MODULE
セクションで、私は持っています:
bpy::class_<NodeWrap, boost::shared_ptr<NodeWrap>, boost::noncopyable>("Node")
...
.def("__setattr__". &NodeWrap::setattr);
私が言ったように、それはうまくコンパイルされ、ノードの「params」を正しく設定しますが、そのような非paramを設定しようとするとself.plain_old_member = 7
、「Recursion Depth Exceeded」エラーが発生します。これは、収集boost::object::attr
するとクラスが呼び出されるためです。 '__setattr__
メソッド
Pythonでは、次を使用してこれを回避します
super(Node).__setattr__(self, attr, val)
問題の行にありますが、boost::pythonからそれを行う方法を理解できません。必要に応じてCAPIにアクセスしてもかまいませんが(実際、PyObject_SetAttrString
無駄に使用してみました)、ここからアクセスする方法がわかりません。
乾杯、マット