2010-04-29 69 views
9

可以使用一個getter和setter方法(在一個簡單的情況下)的屬性添加到類:如何將屬性添加到boost :: python中的模塊?

>>> x = mymodule.X() 
>>> x.foo = 'aaa' 
>>> x.foo 
'aaa' 

但是:

class<X>("X") 
    .add_property("foo", &X::get_foo, &X::set_foo); 

,那麼你可以從蟒蛇像這樣使用它如何添加屬性到模塊本身(不是類)?

scope().attr("globalAttr") = ??? something ??? 

def("globalAttr", ??? something ???); 

我可以添加使用上述兩種方法全局函數和類的對象,但似乎無法添加屬性的方法一樣在課堂上。

回答

2

__getattr____setattr__沒有在模塊上調用,所以你can't do this在普通Python中沒有黑客(就像在模塊字典中存儲一個類)。鑑於此,在Boost Python中使用它的方法不太可能。

2

關於Python維基boost.python/HowTo具有將C++對象作爲模塊屬性內BOOST_PYTHON_MODULE的示例:

namespace bp = boost::python; 
BOOST_PYTHON_MODULE(example) 
{ 
    bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object)); 
} 

要設置屬性的BOOST_PYTHON_MODULE使用外

bp::import("example").attr("my_attr") = bp::object(bp::ptr(&my_cpp_object)); 

現在可以在python做像

from example import my_attr 

當然,您需要提前註冊my_cpp_object的課程(例如,你可以在同一個BOOST_PYTHON_MODULE調用中做到這一點),並確保C++對象的生命週期超過python模塊的壽命。你可以使用任何bp::object而不是包裝C++。

請注意,BOOST_PYTHON_MODULE燕子例外,所以如果你犯了一個錯誤,你不會收到任何錯誤指示和BOOST_PYTHON_MODULE - 生成的函數將立即返回。爲了緩解這種情況下的調試,你可以捕捉異常裏面BOOST_PYTHON_MODULE或臨時增加一些日誌語句的BOOST_PYTHON_MODULE最後一行看到它達到:

BOOST_PYTHON_MODULE(example) 
{ 
    bp::scope().attr("my_attr2") = new int(1); // this will compile 
    std::cout << "init finished\n"; // OOPS, this line will not be reached 
}