gpt4 book ai didi

python - 有没有办法让装饰函数引用装饰器创建的对象?

转载 作者:太空狗 更新时间:2023-10-30 01:24:51 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以让装饰函数引用装饰器包装器创建的对象。当我考虑使用装饰器时,我的问题出现了:

  1. 制作一个包装器,创建一个带有子图的图形
  2. 在包装器内执行装饰函数,它会添加一些绘图
  3. 最后将图形保存在包装器中

但是,装饰函数需要引用包装器创建的图窗。装饰函数如何引用该对象?我们一定要求助于全局变量吗?

这是一个简短的例子,我在装饰函数中引用了一个在包装器中创建的变量(但我没有在不调整全局变量的情况下做到这一点):

def my_decorator(func):
def my_decorator_wrapper(*args, **kwargs):
global x
x = 0
print("x in wrapper:", x)
return func(*args, **kwargs)
return my_decorator_wrapper

@my_decorator
def decorated_func():
global x
x += 1
print("x in decorated_func:", x)

decorated_func()
# prints:
# x in wrapper: 0
# x in decorated_func: 1

我知道这在类里面很容易完成,但出于好奇我问这个问题。

最佳答案

尝试avoid using global variables .

使用参数将对象传递给函数

有一种规范的方法可以将值传递给函数:参数。

调用包装器时将对象作为参数传递给装饰函数。

from functools import wraps

def decorator(f):
obj = 1

@wraps(f)
def wrapper(*args):
return f(obj, *args)

return wrapper

@decorator
def func(x)
print(x)

func() # prints 1

使用默认参数传递相同的对象

如果您需要将同一个对象传递给所有函数,将其存储为装饰器的默认参数是一种替代方法。

from functools import wraps

def decorator(f, obj={}):
@wraps(f)
def wrapper(*args):
return f(obj, *args)

return wrapper

@decorator
def func(params)
params['foo'] = True

@decorator
def gunc(params)
print(params)

func()

# proof that gunc receives the same object
gunc() # prints {'foo': True}

上面创建了一个普通的私有(private)dict,它只能被装饰函数访问。由于 dict 是可变的,因此更改将反射(reflect)在函数调用中。

关于python - 有没有办法让装饰函数引用装饰器创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54316295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com