[英]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_attribute
和instance.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.