2009-01-26 31 views
44

Tôi biết @staticmethod, @classmethod và @property, nhưng chỉ thông qua tài liệu phân tán. Có danh sách đầy đủ các trang trí hàm được xây dựng trong Python không?Python - có danh sách trang trí ở đâu đó không?

+0

Không có danh sách chính thức, nhưng liên kết này hữu ích: https://github.com/lord63/awesome-python-decorator – Casebash

Trả lời

28

Tôi không nghĩ vậy. Trang trí không khác với các chức năng thông thường, bạn chỉ gọi chúng theo cách fancier.

Đối với việc tìm kiếm tất cả trong số họ cố gắng tìm kiếm danh sách Built-in functions, bởi vì khi bạn có thể thấy trong Python glossary cú pháp trang trí chỉ là một đường cú pháp, như là hai định nghĩa sau đây tạo ra các chức năng tương đương (sao chép ví dụ này từ thuật ngữ):

def f(...): 
    ... 
f = staticmethod(f) 

@staticmethod 
def f(...): 

Vì vậy, bất kỳ hàm dựng sẵn nào trả về một hàm khác đều có thể được sử dụng làm trang trí. Câu hỏi là - nó có ý nghĩa để sử dụng nó theo cách đó? :-)

functools mô-đun chứa một số chức năng có thể được sử dụng làm trang trí, nhưng chúng không được tích hợp sẵn mà bạn yêu cầu.

12

Chúng không được tích hợp sẵn, nhưng this library trang trí mẫu nếu rất tốt.

Là Abgan says, danh sách hàm được tích hợp có lẽ là nơi tốt nhất để xem, mặc dù trang trí cũng có thể được triển khai dưới dạng lớp, nó không được đảm bảo toàn diện.

-2

Không có thứ gì như danh sách tất cả trang trí. Không có danh sách tất cả các chức năng. Không có danh sách tất cả các lớp.

Trang trí là một công cụ hữu ích để xác định một khía cạnh chung trên các hàm, phương thức hoặc lớp. Có những trang trí được xây dựng trong. Cộng với có bất kỳ số lượng trang trí mát mẻ và vô dụng. Trong cùng một cách có bất kỳ số lượng các lớp học mát mẻ và vô dụng.

1

Người trang trí thậm chí không cần trả lại hàm. Tôi đã sử dụng @atexit.register trước đây.

+0

Vâng, hàm đó trả về cùng một hàm được chuyển cho nó cho mục đích đó. –

+0

Ồ, phải không? Tôi không bao giờ để ý. – habnabit

+1

"Trang trí thậm chí không cần phải trả lại một hàm" - để tạo ra bất kỳ ý nghĩa nào, bởi vì '@ decor' chỉ là đường cho' f = decor (f) '- nếu không bạn sẽ mất tham chiếu với chức năng bạn đang trang trí. –

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