Tôi có một lớp Event
được định nghĩa trong C++ mà tôi tiếp xúc với Python bằng cách sử dụng Boost. Kịch bản của tôi được dự kiến sẽ lấy được từ lớp này, và tôi muốn làm một số khởi tạo bất cứ khi nào một lớp con mới được định nghĩa.Đặt metaclass của lớp bọc với Boost.Python
Làm cách nào tôi có thể đặt metaclass của lớp Event
tiếp xúc sao cho bất cứ khi nào một tập lệnh Python xuất phát từ lớp này, metaclass có thể thực hiện khởi tạo yêu cầu?
Tôi muốn tránh phải sử dụng một cách rõ ràng metaclass trong kịch bản ...
class KeyboardEvent(Event): # This is what I want
pass
class KeyboardEvent(Event, metaclass=EventMeta): # This is not a good solution
pass
Edit:Một phần của giải pháp
Có vẻ như không có cách nào để đặt metaclass với Boost.Python. Điều tốt nhất tiếp theo là ứng biến và thay đổi metaclass sau khi lớp được xác định. Trong Python bản xứ, the safe way để thay đổi một metaclass là để làm điều này:
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
trong Boost, nó sẽ giống như thế này:
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__"]));
}
Vấn đề là tôi dường như không thể tìm thấy một cách để xác định một metaclass với Boost.Python, đó là lý do tại sao tôi đã mở How to define a Python metaclass with Boost.Python?.
Có thể 'lớp EventWithMeta (Sự kiện, metaclass = EventMeta): pass' rồi' class KeyboardEvent (EventWithMeta); class AnotherEvent (EventWithMeta) '? – reclosedev
@reclosedev No. Vấn đề không phải là tôi gõ từ "metaclass". Đó là sự cần thiết cho một metaclass là một chi tiết thực hiện mà không nên bị rò rỉ đến giao diện tiếp xúc với các kịch bản. –
Có lẽ tôi đang thiếu một cái gì đó, nhưng trong trường hợp này 'Event' có thể được đổi tên thành' _Event' hoặc một cái gì đó như thế này, và 'EventWithMeta' thành' Event'. – reclosedev