我有一个装饰器声明为一个类:
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)
Run Code Online (Sandbox Code Playgroud)
...当我用它来包装类中的方法时,调用该方法似乎并没有将对象的实例设置为第一个参数.虽然这种行为并非完全出乎意料,self但当方法成为实例方法时,我将如何进行冻结?
简化示例:
class test_decorator(object):
def __init__(self, fn):
self.fn = fn
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
class Foo(object):
@test_decorator
def some_method(self):
print(self)
Foo().some_method()
Run Code Online (Sandbox Code Playgroud)
foo的预期实例,而是得到一个错误,说0参数被传递.
小智 4
想通了 - 需要定义一个__get__方法才能创建一个MethodType绑定,如下所示:
def __get__(self, obj, objtype=None):
return MethodType(self, obj, objtype)
Run Code Online (Sandbox Code Playgroud)
MethodType当调用冻结参数的对象的方法时,它会创建一个对象self。
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |