用decorator类修饰的方法没有冻结“self”参数

2024-04-25 14:49:13 发布

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

我有一个decorator声明为类:

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, *args, **kwargs):
        if not self.validate(*args, **kwargs):
            raise PredicateNotMatchedError("predicate was not matched")
        return self.fn(*args, **kwargs)

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


简化示例:

^{pr2}$

应为foo的实例,但得到错误消息,说明传递了0个参数。在


Tags: 实例方法self声明参数returndefnot
1条回答
网友
1楼 · 发布于 2024-04-25 14:49:13

找到了-需要定义一个__get__方法来创建MethodType绑定,如下所示:

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

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

相关问题 更多 >