类装饰器对象没有属性 __name__

0 投票
1 回答
1630 浏览
提问于 2025-04-18 16:37

我写了一个装饰器类,内容如下:

import functools

class ViewCounter(object):
    def __init__(self,user_slug=None):
        self.user_slug = user_slug

    def __call__(self, func):
        @functools.wraps(func)
        def wrapped_func(*args, **kwargs):
            return func(*args,**kwargs)
        return wrapped_func

我把这个装饰器应用到了我用Django写的一个基于类的视图上,方法是使用了Django的method_decorator,像这样:

class ProjectPage(DetailView):
    template_name = 'account/profile-page-latest.html'
    model = User
    context_object_name = 'user_obj'

    @method_decorator(ViewCounter) 
    def dispatch(self, *args, **kwargs):
        return super(ProjectPage, self).dispatch(*args, **kwargs)

但是在我的控制台中出现了这个错误:

AttributeError: 'ViewCounter' object has no attribute '__name__'

1 个回答

0

我觉得使用 @method_decorator(ViewCounter()) 应该能解决这个问题。ViewCounter 不是一个普通的函数装饰器,而是一个类,这个类的实例可以作为函数装饰器使用。

撰写回答