Sự khác biệt chính giữa metaclasses và lớp trang trí của Python là gì? Có cái gì tôi có thể làm với một nhưng không phải với người khác?Các metaclasses của Python và trang trí lớp học
Trả lời
Trang trí rất nhiều, đơn giản hơn và hạn chế hơn - và do đó nên được ưu tiên bất cứ khi nào hiệu ứng mong muốn có thể đạt được với metaclass hoặc trang trí lớp.
Bất cứ điều gì bạn có thể làm với trình trang trí lớp, bạn có thể làm với một metaclass tùy chỉnh (chỉ cần áp dụng chức năng của "decorator function", tức là một trong đó có một đối tượng lớp và sửa đổi nó, trong khóa học của số __new__
hoặc __init__
của metaclass để tạo đối tượng lớp! -). Có rất nhiều điều bạn có thể làm trong một metaclass tùy chỉnh nhưng không có trong một trang trí (trừ khi trang trí nội bộ tạo ra và áp dụng một metaclass tùy chỉnh, tất nhiên - nhưng đó là gian lận; -) ... và thậm chí sau đó, trong Python 3, có những thứ bạn chỉ có thể làm với một metaclass tùy chỉnh, không phải sau thực tế ... nhưng đó là một tiểu vùng khá tiên tiến của câu hỏi của bạn, vì vậy hãy để tôi đưa ra các ví dụ đơn giản hơn). Ví dụ: giả sử bạn muốn tạo đối tượng lớp X
sao cho print X
(hoặc bằng Python 3 print(X)
tất nhiên ;-) hiển thị peekaboo!
. Bạn không thể làm điều đó mà không có một metaclass tùy chỉnh, bởi vì ghi đè của metaclass của __str__
là diễn viên quan trọng ở đây, tức là, bạn cần một def __str__(cls): return "peekaboo!"
trong metaclass tùy chỉnh của lớp X
. Áp dụng tương tự cho tất cả các phương pháp ma thuật, nghĩa là, đối với tất cả các loại hoạt động như được áp dụng cho chính đối tượng lớp (ngược lại, áp dụng cho trường hợp, sử dụng các phương pháp ma thuật như được định nghĩa trong lớp học - các hoạt động trên chính đối tượng lớp đó sử dụng các phương thức ma thuật như được định nghĩa trong metaclass).
- 1. Lớp học kiểu cũ, lớp học kiểu mới và metaclasses
- 2. Đối số trang trí lớp học Python
- 3. Python metaclasses
- 4. Metaclasses và __slots__?
- 5. Áp dụng trang trí python với các phương pháp trong một lớp học
- 6. Trang trí và thừa kế của Python
- 7. Trình trang trí Python và kế thừa lớp
- 8. python: trang trí một lớp bằng cách xác định trang trí là một lớp
- 9. Python: Làm cách nào để truy cập vào cá thể của lớp được trang trí từ bên trong một trình trang trí lớp học?
- 10. Viết một trang trí lớp học mà áp dụng một trang trí cho tất cả các phương pháp
- 11. Python lớp trang trí mở rộng lớp gây đệ quy
- 12. python @abstractmethod trang trí
- 13. Trình trang trí Python trên các thành viên lớp không khi cơ chế trang trí là một lớp
- 14. Sự khác biệt giữa các lớp trang trí và chức năng trang trí
- 15. phương pháp metaclasses trên các cá thể lớp
- 16. tổ chức các lớp học và mô-đun trong python
- 17. Thiết lập một lớp metaclass sử dụng một trang trí
- 18. Python 2.6: Lớp bên trong lớp học?
- 19. Trang trí và phương pháp python
- 20. __decorated__ cho trang trí python
- 21. Biến toàn cầu Các lớp học Python
- 22. Làm thế nào để trang trí một phương pháp bên trong một lớp học?
- 23. Trang trí python cho lớp HOẶC chức năng
- 24. Sự khác biệt giữa trình trang trí Python và mẫu trang trí là gì?
- 25. Các trang trí tĩnh và classmethod có thể được triển khai trong Python thuần túy không?
- 26. Python - kế thừa từ các lớp học kiểu cũ
- 27. OO JQuery và các lớp học
- 28. Metaclasses Python: Tại sao __setattr__ không được gọi cho các thuộc tính được đặt trong khi định nghĩa lớp?
- 29. python trang trí với javascript
- 30. Các lớp học riêng và uml
câu trả lời thú vị từ đồng hương nổi tiếng =) – gpilotino
Xin chào gino, luôn đặc biệt vui mừng khi giúp đỡ đồng bào của khóa học ;-). –
Vâng .. đã 4 năm rồi và tôi tìm thấy câu hỏi này tại google. Tôi chỉ muốn ghi chú về ví dụ của bạn. Tôi đã định nghĩa một trang trí 'foo (cls)' có 2 câu lệnh: 'cls .__ str__ = lambda self:" peekaboo! "' Và ngay sau đó 'return cls', và nó thực sự hoạt động - tôi đã thiết lập' __str__' phương pháp của một số lớp học với trang trí hơn là với một metaclass phức tạp .. Tôi chỉ muốn lưu ý điều này, và có thể nhận được một số bình luận để biết nếu tôi đang thiếu một cái gì đó. – rboy