1 回答

TA贡献1797条经验 获得超6个赞
诀窍是将函数的参数存储为调用链的一部分。最简单的方法是使用functools.partial对象。
from functools import wraps, partial
def chain(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
suspended = partial(func, self, *args, **kwargs)
self.call_chain.append(suspended)
return self
return wrapper
class Test:
def __init__(self, a, b, c):
self.call_chain = []
self._a = a
self._b = b
self._c = c
@chain
def a(self, val):
return self._a == val
@chain
def b(self, val):
return self._b == val
@chain
def c(self, val):
return self._c == val
def evaluate(self):
try:
for f in self.call_chain:
if f() == False:
raise ValueError('False encountered')
except ValueError:
self.call_chain.clear()
return False
self.call_chain.clear()
return True
c = Test(True, False, 13)
c.a(True).b(False).c(13).evaluate() # True
c.a(True).b(False).c(11).evaluate() # False
添加回答
举报