加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用装饰器类装饰的方法没有冻结“self”参数

发布时间:2020-12-16 22:19:29 所属栏目:Python 来源:网络整理
导读:我有一个装饰器声明为一个类: class predicated(object): def __init__(self,fn): self.fn = fn self.fpred = lambda *args,**kwargs: True def predicate(self,predicate): self.fpred = predicate return self def validate(self,*args,**kwargs): return

我有一个装饰器声明为一个类:

class predicated(object):
    def __init__(self,fn):
        self.fn = fn
        self.fpred = lambda *args,**kwargs: True

    def predicate(self,predicate):
        self.fpred = predicate
        return self

    def validate(self,*args,**kwargs):
        return self.fpred(*args,**kwargs)

    def __call__(self,**kwargs):
        if not self.validate(*args,**kwargs):
            raise PredicateNotMatchedError("predicate was not matched")
        return self.fn(*args,**kwargs)

…当我用它来包装类中的方法时,调用该方法似乎并没有将对象的实例设置为第一个参数.虽然这种行为并不完全出乎意料,但当方法成为实例方法时,如何让自我被冻结?

简化示例:

class test_decorator(object):
    def __init__(self,fn):
        self.fn = fn
    def __call__(self,**kwargs):
        return self.fn(*args,**kwargs)

class Foo(object):
    @test_decorator
    def some_method(self):
        print(self)

Foo().some_method()

foo的预期实例,而是得到一个错误,说0参数被传递.

最佳答案
想出来 – 需要定义一个__get__方法,以便像这样创建一个MethodType绑定:

def __get__(self,obj,objtype=None):
    return MethodType(self,objtype)

在冻结self参数的对象上调用方法时创建一个MethodType对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读