2010-04-29 35 views
9

Bạn có thể thêm một tài sản để một lớp học sử dụng một phương thức getter và setter (trong trường hợp đơn giản):Cách thêm thuộc tính vào mô-đun trong tăng :: python?

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

Vì vậy, sau đó bạn có thể sử dụng nó từ trăn như thế này:

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

Nhưng làm thế nào để thêm một tài sản vào một mô-đun chính nó (không phải là một lớp)?

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

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

tôi có thể thêm chức năng toàn cầu và đối tượng của lớp của tôi bằng cách sử dụng hai cách trên, nhưng dường như không thể thêm các thuộc tính cách tương tự như Trong các lớp học.

Trả lời

2

__getattr____setattr__ không được gọi trên mô-đun, vì vậy bạn can't do this bằng Python thông thường không có hack (như lưu trữ một lớp trong từ điển mô-đun). Cho rằng, nó rất khó có một cách thanh lịch để làm điều đó trong Boost Python hoặc.

2

boost.python/HowTo trên Python Wiki có một ví dụ về lộ đối tượng C++ như một thuộc tính mô-đun bên BOOST_PYTHON_MODULE:

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

Để thiết lập các thuộc tính bên ngoài của BOOST_PYTHON_MODULE sử dụng

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

Bây giờ bạn có thể làm trong python một cái gì đó như

from example import my_attr 

Tất nhiên, bạn cần đăng ký trước số my_cpp_object (ví dụ: bạn có thể làm điều này bên trong cùng một cuộc gọi BOOST_PYTHON_MODULE) và đảm bảo tuổi thọ đối tượng C++ vượt quá thời gian của mô-đun python. Bạn có thể sử dụng bất kỳ bp::object nào thay vì gói C++ một.

Lưu ý rằng BOOST_PYTHON_MODULE ngoại lệ nuốt, vì vậy nếu bạn nhầm lẫn, bạn sẽ không nhận được bất kỳ chỉ báo lỗi nào và BOOST_PYTHON_MODULE chức năng được tạo sẽ chỉ trả về ngay lập tức. Để dễ dàng gỡ lỗi trường hợp này, bạn có thể bắt ngoại lệ bên trong BOOST_PYTHON_MODULE hoặc tạm thời thêm một số tuyên bố ghi nhật ký làm dòng cuối cùng của BOOST_PYTHON_MODULE để xem nó đạt được:

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 
} 
Các vấn đề liên quan