gpt4 book ai didi

python - 嵌套类装饰器也是描述符类

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:46 29 4
gpt4 key购买 nike

我有一种情况需要使用像下面这样的嵌套装饰器,

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

最佳答案

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

装饰

@deco1
@deco2
def m

可以重写为

m = deco1(deco2(m))

所以当 deco1 参数被计算时 deco2.get 被调用。

关于python - 嵌套类装饰器也是描述符类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55094686/

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