2011-02-20 36 views
12
  • Cách thực hiện __slots__ bằng Python?
  • Điều này có bị lộ trong số C interface không?
  • Làm cách nào để nhận được hành vi __slots__ khi xác định lớp Python trong C qua PyTypeObject?
+0

thể Bạn chỉ cần gán cho thuộc tính '__slots__' từ giao diện C giống như bạn làm trong một tệp .py? –

+0

@David Heffernan: Chỉ trên các hệ thống không kế thừa';) '. –

Trả lời

17

Khi tạo lớp Python, theo mặc định, chúng có __dict__ và bạn có thể đặt bất kỳ thuộc tính nào trên chúng. Điểm của các khe là không tạo ra một __dict__ để tiết kiệm không gian.

Trong giao diện C, theo cách khác, lớp mở rộng theo mặc định không có __dict__ và thay vào đó, bạn phải thêm một và thêm hỗ trợ getattr/setattr để xử lý (mặc dù may mắn có các phương pháp cho điều này) , PyObject_GenericGetAttrPyObject_GenericSetAttr, vì vậy bạn không cần phải thực hiện chúng, chỉ cần sử dụng chúng (Funnily không PyObject_GenericDelAttr, mặc dù, tôi không chắc chắn đó là những gì. (Tôi có lẽ nên ngừng làm tổ ngoặc như thế này (hoặc không)))).

Vì vậy, không cần thiết và cũng không có ý nghĩa đối với các loại Tiện ích mở rộng. Theo mặc định, bạn chỉ cho phép các phương thức getattr/setatttr của bạn truy cập chỉ những thuộc tính mà lớp đó có.

Đối với làm thế nào nó được thực hiện, các mã trong typeobject.c, và đó là khá nhiều chỉ là vấn đề "Nếu đối tượng có một thuộc tính __slots__, không tạo ra một __dict__. Khá unexciting. :-)

+0

PyObject_GenericDelAttr = PyObject_GenericSetAttr với một đối số giá trị NULL – ncoghlan

+3

Huh, các tài liệu API của C thực sự không đúng với việc ghi lại thực tế rằng các phương thức tp_setattr và tp_setattro cũng được cho là có khả năng xử lý việc xóa ... – ncoghlan

+1

F hoặc chi tiết hơn về cách thức __slots__ được triển khai, Python gần tương đương tại http://code.activestate.com/recipes/532903-how-__slots__-are-implemented/ đáng xem. – joeln

Các vấn đề liên quan