任何人都知道這段代碼有什麼問題嗎?Python實例方法上的裝飾器
def paginated_instance_method(default_page_size=25):
def wrap(func):
@functools.wraps(func)
def inner(self, page=1, page_size=default_page_size, *args, **kwargs):
objects = func(self=self, *args, **kwargs)
return _paginate(objects, page, page_size)
return inner
return wrap
class Event(object):
...
@paginated_instance_method
def get_attending_users(self, *args, **kwargs):
return User.objects.filter(pk__in=self.attending_list)
我收到以下錯誤:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/zarathustra/Virtual_Envs/hinge/hinge_services/hinge/api/decorators.py", line 108, in wrap
def inner(self, page=1, page_size=default_page_size, *args, **kwargs):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'Event' object has no attribute '__name__'
爲什麼我認爲這會工作是因爲,通過試驗和錯誤,我得到了下面的裝飾像classmethods一個魅力的工作的理由:
def paginated_class_method(default_page_size=25):
def wrap(func):
@functools.wraps(func)
def inner(cls, page=1, page_size=default_page_size, *args, **kwargs):
objects = func(cls=cls, *args, **kwargs)
return _paginate(objects, page, page_size)
return inner
return wrap
你的裝飾就沒有意義了。裝飾器應該將一個函數作爲參數,但是你只需要一個參數,這顯然是一個數字('default_page_size')。你打算用'@paginated_instance_method(10)'來裝飾嗎? – BrenBarn 2013-02-26 20:23:36
@BrenBarn是的,我試圖做到這一點。我是新來的裝飾者,但我會添加一個編輯來解釋爲什麼我認爲它會起作用。 – 2013-02-26 20:25:48
你能展示你如何使用其他裝飾器嗎? – BrenBarn 2013-02-26 20:27:29