Tôi có một lớp học trang trí một số phương pháp bằng cách sử dụng một trang trí từ một thư viện khác. Cụ thể, lớp này phân lớp các tài nguyên bình yên, trang trí các phương thức http với httpauth.HTTPBasicAuth().login_required()
và thực hiện một số mặc định hợp lý trên một dịch vụ mô hình.Có cách nào khác để bỏ qua trang trí theo phương pháp của phân lớp không?
Trên hầu hết các lớp con tôi muốn trang trí được áp dụng; do đó tôi muốn loại bỏ nó hơn là thêm nó vào các lớp con.
Suy nghĩ của tôi là có phương pháp riêng tư hoạt động và phương pháp công khai được trang trí. Các tác dụng của trang trí có thể tránh được bằng cách ghi đè phương thức công khai để gọi riêng tư và không trang trí quá trình ghi đè này. Ví dụ được mô phỏng bên dưới.
Tôi tò mò muốn biết nếu có cách nào tốt hơn để thực hiện việc này. Có một phím tắt cho 'hủy bỏ trang trí' trong python cung cấp cho hiệu ứng này?
Hoặc bạn có thể giới thiệu phương pháp tiếp cận tốt hơn không?
Một số câu hỏi khác có câu trả lời phù hợp cho điều này, ví dụ: Is there a way to get the function a decorator has wrapped?. Nhưng câu hỏi của tôi là về thiết kế rộng hơn - tôi quan tâm đến mọi cách pythonic để chạy các hoạt động trong các phương pháp được trang trí mà không ảnh hưởng đến việc trang trí. Ví dụ. ví dụ của tôi là một trong những cách như vậy nhưng có thể có những người khác.
def auth_required(fn):
def new_fn(*args, **kwargs):
print('Auth required for this resource...')
fn(*args, **kwargs)
return new_fn
class Resource:
name = None
@auth_required
def get(self):
self._get()
def _get(self):
print('Getting %s' %self.name)
class Eggs(Resource):
name = 'Eggs'
class Spam(Resource):
name = 'Spam'
def get(self):
self._get()
# super(Spam, self)._get()
eggs = Eggs()
spam = Spam()
eggs.get()
# Auth required for this resource...
# Getting Eggs
spam.get()
# Getting Spam
Có thể trùng lặp của [Có cách nào để có được chức năng mà một người trang trí đã gói không?] (Http://stackoverflow.com/questions/1545178/is- có một công cụ trang trí-đã-được-bọc) – Oin