繁体   English   中英

Python从装饰器返回额外的值

[英]Python return extra value from decorator

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

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可以轻松访问该对象

这不是装饰员可以做的。 装饰者所能做的就是为给定的函数对象返回不同的东西。 在命名空间中,您无法选择将返回值分配给什么。

更好的选择是:

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

     def my_awesome_decorator(*d): def wrapping_function(func): def wrapper(*args, **kwargs): # ... wrapper.some_attribute = ... return wrapper return wrapping_function 

    之后可以使用ClassObject.methodname.some_attributeinstance.methodname.some_attribute

  • 对于Python 3.6或更高版本,可以为类的基类添加__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 

    之后,子类将跨找到的第一个method._special_attribute_name属性复制到类对象; 装饰者可以在方法上设置该属性。

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

     class SomeMetaClass(type): def __new__(mcls, name, bases, namespace, **kwds): special = None for attr in namespace.values(): special = getattr(attr, '_special_attribute_name', None) if special is not None: break namespace['target_attribute'] = special return super().__new__(mcls, name, bases, namespace, **kwds) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM