gpt4 book ai didi

python - 在装饰器内部使用部分时 self 丢失

转载 作者:行者123 更新时间:2023-12-04 02:10:28 26 4
gpt4 key购买 nike

我正在尝试从一个使用另一个类的装饰器的类中编写一个方法。问题是我需要存储在包含装饰器(ClassWithDecorator.decorator_param)的类中的信息。为了实现这一点,我使用部分注入(inject) self 作为第一个参数,但是当我这样做时,使用装饰器的类中的 self 以某种方式“迷路了”,我最终得到了一个错误。请注意,如果我从 my_decorator() 中删除 partial() 并且“self”将正确存储在 *args 中,则不会发生这种情况。

查看代码示例:

from functools import partial


class ClassWithDecorator:
def __init__(self):
self.decorator_param = "PARAM"

def my_decorator(self, decorated_func):
def my_callable(ClassWithDecorator_instance, *args, **kwargs):
# Do something with decorator_param
print(ClassWithDecorator_instance.decorator_param)
return decorated_func(*args, **kwargs)

return partial(my_callable, self)


decorator_instance = ClassWithDecorator()


class WillCallDecorator:
def __init__(self):
self.other_param = "WillCallDecorator variable"

@decorator_instance.my_decorator
def decorated_method(self):
pass


WillCallDecorator().decorated_method()

我明白了

PARAM
Traceback (most recent call last):
File "****/decorator.py", line 32, in <module>
WillCallDecorator().decorated_method()
File "****/decorator.py", line 12, in my_callable
return decorated_func(*args, **kwargs)
TypeError: decorated_method() missing 1 required positional argument: 'self'

如何将 WillCallDecorator() 对应的 self 传递给 decorated_method() 但同时将信息从它自己的类传递给 my_callable() ?

最佳答案

看来你可能想使用partialmethod而不是部分:

来自文档:

class functools.partialmethod(func, /, *args, **keywords)

When func is a non-descriptor callable, an appropriate bound method is created dynamically. This behaves like a normal Python function when used as a method: the self argument will be inserted as the first positional argument, even before the args and keywords supplied to the partialmethod constructor.

关于python - 在装饰器内部使用部分时 self 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59425321/

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