适用于classmethods和实例方法的Decorator

时间:2013-02-28 15:36:38

标签: python decorator python-decorators class-method instance-methods

我有两个装饰器,定义如下,两者完全相同:

# ONLY WORKS FOR 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


# ONLY WORKS FOR INSTANCEMETHODS
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

我有两个原因是因为对于类方法,我需要在第一个arg中传递cls = cls,例如我需要在self = self中传递的方法。但这显然不太理想。有没有人知道构建一个可用于实例方法和类方法的装饰器的方法?

1 个答案:

答案 0 :(得分:3)

只需传递clsself作为第一个位置参数,不需要传递它们作为关键字参数:

def paginated_class_method(default_page_size=25):
    def wrap(func):
        @functools.wraps(func)
        def inner(self_or_cls, page=1, page_size=default_page_size, *args, **kwargs):
            objects = func(self_or_cls, *args, **kwargs)
            return _paginate(objects, page, page_size)
        return inner
    return wrap