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

前端之家收集整理的这篇文章主要介绍了用装饰器类装饰的方法没有冻结“self”参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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对象.

猜你在找的Python相关文章