嵌套类装饰器,也是描述符类

2024-05-14 07:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种情况,我需要使用嵌套的装饰器,如下所示

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


Tags: selfgetreturnobjectinitdefargscall
1条回答
网友
1楼 · 发布于 2024-05-14 07:58:00

deco2.get在创建修饰的m时被调用[一次]。你知道吗

装饰

@deco1
@deco2
def m

可以重写为

m = deco1(deco2(m))

所以在计算deco1参数时,调用了deco2.get。你知道吗

相关问题 更多 >

    热门问题