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