2009-11-22 32 views

Trả lời

34

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).

+0

câu trả lời thú vị từ đồng hương nổi tiếng =) – gpilotino

+0

Xin chào gino, luôn đặc biệt vui mừng khi giúp đỡ đồng bào của khóa học ;-). –

+6

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

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