首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套类装饰器,也是描述符类

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

Stack Overflow用户
提问于 2019-03-11 03:00:20
回答 1查看 427关注 0票数 4

我遇到了需要使用嵌套装饰器的情况,如下所示,

代码语言:javascript
复制
class A(object):
    def __init__(self,v):
        print("A.init")
    @deco1
    @deco2
    def m(self, a):
        print("A.m")

装饰师的实现方式如下,

代码语言:javascript
复制
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类上的描述符方法没有被调用,我需要调用它。当我做下面这样的事情时,

代码语言:javascript
复制
aa = A(100)
aa.m(10)

实际

代码语言:javascript
复制
deco1.get
deco1.call.before
deco2.call.before
A.m
deco2.call.after
deco1.call.after

期望

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2019-03-11 06:17:50

当创建修饰的m时,只调用一次。

装饰

代码语言:javascript
复制
@deco1
@deco2
def m

可以重写为

代码语言:javascript
复制
m = deco1(deco2(m))

因此,当计算deco1参数时,会调用cox2.get。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55094686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档