Python从装饰器返回额外的值

时间:2018-06-17 15:37:12

标签: python decorator python-decorators

我有一些函数,我想根据在装饰器中传递给它的参数值进行一些计算。我能够实现这一点,但装饰器填充了一个重要的对象,我想稍后重用。例如..

def my_awesome_decorator(*d):
    how_do_i_return_this_object_which_got_created_here
    def wrapping_function(func):
        def wrapper(*args, **kwargs):
            ...
        return wrapper
    return wrapping_function


class A:
    @my_awesome_decorator(d)
    def fun(a, b, c):
        ...

我希望使用object_A.how_do_i_return_this_object_which_got_created_here

轻松访问该对象

1 个答案:

答案 0 :(得分:0)

这不是装饰者可以做的事情。装饰器可以做的就是为给定的函数对象返回不同的东西。您无法在命名空间中选择分配返回值的内容。

更好的选择是:

  • 在装饰函数上使用属性:

    using (var context = new BloggingContext())
    {
        var blogs = context.Blogs
            .Include(blog => blog.Posts)
                .ThenInclude(post => post.Author)
            .Include(blog => blog.Posts)
                .ThenInclude(post => post.Tags)
            .ToList();
    }
    

    之后def my_awesome_decorator(*d): def wrapping_function(func): def wrapper(*args, **kwargs): # ... wrapper.some_attribute = ... return wrapper return wrapping_function ClassObject.methodname.some_attribute可用。

  • 对于Python 3.6或更高版本,您可以将instance.methodname.some_attribute方法添加到类的基类中。它可以与装饰器设置的属性结合,将属性复制到类:

    __init_subclass__

    在哪个子类将复制到找到类对象的第一个class BaseClass: def __init_subclass__(cls, **kwargs): super().__init_subclass__() special = None for attr in vars(cls).values(): special = getattr(attr, '_special_attribute_name', None) if special is not None: break cls.target_attribute = special 属性之后;装饰者可以在方法上设置该属性。

  • 对于早期的Python版本,使用元类来执行相同的操作:

    method._special_attribute_name