- 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 quaPyTypeObject
?
Trả lời
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_GenericGetAttr
và PyObject_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. :-)
PyObject_GenericDelAttr = PyObject_GenericSetAttr với một đối số giá trị NULL – ncoghlan
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
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
- 1. Triển khai Netcat bằng Python
- 2. Làm cách nào để triển khai xác thực bảo mật bằng xml-rpc trong python?
- 3. Làm cách nào để triển khai jScroll?
- 4. Triển khai đầy đủ RSA bằng Python
- 5. Triển khai Grails - Cách nhanh nhất để được triển khai?
- 6. Làm cách nào để triển khai IEnumerable?
- 7. Làm cách nào để triển khai FileTimeToSystemTime?
- 8. Làm cách nào để triển khai bộ?
- 9. Làm cách nào để triển khai tệp zip được tạo bằng plugin maven-antrun?
- 10. Metaclasses và __slots__?
- 11. Làm cách nào để triển khai trình tạo trong C++?
- 12. Làm thế nào để triển khai một máy chủ tối thiểu cho AJAX bằng Python?
- 13. Làm thế nào để triển khai cho Heroku bằng Mercurial?
- 14. Làm thế nào để triển khai Scrum?
- 15. Làm cách nào để triển khai OCR trên trang web bằng PHP?
- 16. Làm cách nào để triển khai gọi lại trong PHP?
- 17. [python]: cách triển khai slice trong python3?
- 18. Cách BigDecimal được triển khai?
- 19. Làm cách nào để triển khai tiếp tục?
- 20. Phương thức, `classmethod` và` staticmethod` được triển khai bằng Python như thế nào?
- 21. Làm cách nào để triển khai ứng dụng php
- 22. Làm cách nào để triển khai chỉ các mô-đun phụ sử dụng triển khai maven?
- 23. Làm cách nào để triển khai ứng dụng ASP.NET MVC3?
- 24. Atan2 được triển khai bằng .NET như thế nào?
- 25. Làm cách nào để triển khai Unix grep trong Perl?
- 26. Triển khai Python của Parsec?
- 27. Làm cách nào để triển khai IUserType chính xác?
- 28. Làm cách nào để buộc gcc sử dụng các triển khai tùy chỉnh của các hàm được triển khai newlibc?
- 29. Làm thế nào để triển khai một webapp python với các phụ thuộc bằng cách sử dụng virtualenv?
- 30. Làm cách nào để triển khai giao diện một cách rõ ràng bằng phương pháp ảo?
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? –
@David Heffernan: Chỉ trên các hệ thống không kế thừa';) '. –