Tôi đã cố tạo một trình trang trí có thể được sử dụng với cả hàm và phương thức trong python. Điều này trên riêng của nó không phải là khó khăn, nhưng khi tạo một trang trí mà có đối số, nó có vẻ là.Sử dụng cùng một trang trí (với đối số) với các hàm và phương thức
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
Đoạn mã trên kết thúc tốt đẹp các chức năng/phương pháp đúng, nhưng trong trường hợp của một phương pháp, lập luận request
là dụ nó đang hoạt động trên, không phải là phi tự số đầu tiên.
Có cách nào để biết liệu trang trí đang được áp dụng cho một hàm thay vì phương thức hay không và xử lý tương ứng?
Bạn nên thêm 'update_wrapper (self, func)' vào đầu * của '_MethodDecoratorAdaptor .__ init__' (trong đó update_wrapper là từ vui mô-đun ctools). Điều này làm cho các trang trí kết quả giữ lại các thuộc tính tùy chỉnh trên các hàm/các callables mà chúng trang trí, trong khi vẫn giữ chúng tương thích. – spookylukey
Tôi đã phát hiện ra rằng phương pháp này chỉ hoạt động trong một số trường hợp và rất khó gỡ lỗi khi nó không hoạt động. http://groups.google.com/group/django-developers/msg/f36976f5cfbcbeb3 – spookylukey
@spookylukey Trên thực tế, cách xử lý này ở Django cũng khá sạch sẽ. – astrojuanlu