作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个声明为类的装饰器:
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
被卡住?
简化示例:
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()
预期的 foo 实例,而不是得到一个错误,指出传递了 0 个参数。
最佳答案
弄清楚了 - 需要定义一个 __get__
方法来创建一个 MethodType
绑定(bind),如下所示:
def __get__(self, obj, objtype=None):
return MethodType(self, obj, objtype)
在卡住 self
参数的对象上调用方法时,它会创建一个 MethodType
对象。
关于python - 用装饰器类装饰的方法没有卡住 "self"参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616409/
我刚开始使用 Dagger 2,想知道与我目前用来实现依赖注入(inject)的技术相比,它有什么优势。 目前,为了实现 DI,我创建了一个具有两种风格的项目:mock 和 prod。在这些风格中,我
我是一名优秀的程序员,十分优秀!