我遇到了需要使用嵌套装饰器的情况,如下所示,
class A(object):
def __init__(self,v):
print("A.init")
@deco1
@deco2
def m(self, a):
print("A.m")装饰师的实现方式如下,
class deco1(object):
def __init__(self, f):
print("deco1.init")
self.f = f
def __call__(self, *args, **kwargs):
print("deco1.call.before")
r = self.f(*args, **kwargs)
print("deco1.call.after")
return r
def __get__(self, o, c):
print("deco1.get")
return MethodType(self, o)
class deco2(object):
def __init__(self, f):
print("deco2.init")
self.f = f
def __call__(self, *args, **kwargs):
print("deco2.call.before")
r = self.f(*args, **kwargs)
print("deco2.call.after")
return r
def __get__(self, o, c):
print("deco2.get")
return MethodType(self, o)问题是deco2类上的描述符方法没有被调用,我需要调用它。当我做下面这样的事情时,
aa = A(100)
aa.m(10)实际
deco1.get
deco1.call.before
deco2.call.before
A.m
deco2.call.after
deco1.call.after期望
deco1.get
deco1.call.before
deco2.get #deco2.__get__ to be called
deco2.call.before
A.m
deco2.call.after
deco1.call.after我需要一个单独的装饰师是有原因的。考虑到这一点,我怎样才能做到这一点呢?另外,如果有人能解释为什么不调用deco2.get,那就太好了!谢谢。
使用Python 3.7.x
发布于 2019-03-11 06:17:50
当创建修饰的m时,只调用一次。
装饰
@deco1
@deco2
def m可以重写为
m = deco1(deco2(m))因此,当计算deco1参数时,会调用cox2.get。
https://stackoverflow.com/questions/55094686
复制相似问题