[英]Pass instance variables to a wrapper inside a decorator class
在上一个问题中,有人告诉我,我可以使用getattr
方法将实例变量传递给装饰器 function。 例如,这里我应该可以将c
传递给 some_wrapper。
如果有人感兴趣,这是原始问题。 将实例变量传递给装饰器
import functools
def some_func(
a = False
,b = None
):
def some_decorator(func):
@functools.wraps(func)
def some_wrapper(self, *args, **kwargs):
c = getattr(self, 'c', None)
...
class MyClass:
def __init__(self, arg, c=None):
self.arg = arg
self.c = c
@some_func(a=True)
def foo(self, x, y):
...
编辑:
上面允许我做的是在将 foo 传递给装饰器时将c
传递给some_wrapper
。 因此,如果我有另一种方法,例如:
@some_func(a=True)
def bar(self, alpha, beta):
...
self.c
被传递给其他实例方法,这就是我想要的。
instance = MyClass(arg, c = 'Hi')
instance.foo(arg, blarg)
instance.bar(alpha, beta)
但是,我决定 go 使用不同的路线并将 function 装饰器转换为 class 装饰器。 IE:
class SomeClass():
def __init__(self, *args, **kwargs):
self.a = None
self.b = None
def __get__(self, obj, objtype):
import functools
return functools.partial(self.__call__, obj)
def __call__(self, *args, **kwargs):
def some_wrapper(*args, **kwargs):
c = getattr(self, 'c', None)
...
self.func = args[0]
return some_wrapper
getattr
的工作方式与我在第一个示例中展示的方式不同。 我在黑暗中的猜测是,在我的第二个示例中,function 不再作为参数传递,因此 getattr( self
getattr(self, 'c', None)
中的 self 不再引用装饰的 function 中的实例。
有解决办法吗?
为我工作:
import functools
def some_func(a=False, b=None):
def some_decorator(func):
@functools.wraps(func)
def some_wrapper(self: "MyClass", *args, **kwargs):
kwargs.pop("y")
c = self.c
return func(self, *args, **kwargs, y=c)
return some_wrapper
return some_decorator
class MyClass:
def __init__(self, arg, c=None):
self.arg = arg
self.c = c
@some_func(a=True)
def foo(self, x, y):
print(f"foo x={x} y={y}")
no_c = MyClass("arg")
no_c.foo(x=3, y=4)
yes_c = MyClass("blarg", c="I do")
yes_c.foo(x=3, y=4)
output:
foo x=3 y=None
foo x=3 y=I do
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.