将返回自我的函数装饰器?

我必须遵循将使用从类变量派生的可链接方法创建对象的类。由于这个代码是相当重复的,我的挑战就是如何能够在应用方法的装饰a,b和c。我面临的问题是我似乎无法找到一种方法来构造将返回实例 ( self)的包装器。有没有更好的方法来构建它?


class Test:


    def __init__(self, a, b, c):

        self._a = a

        self._b = b

        self._c = c


        self.call_chain = []



    def a(self, truth):

        def func():

            return self._a == truth

        self.call_chain.append(func)

        return self



    def b(self, truth):

        def func():

            return self._b == truth

        self.call_chain.append(func)

        return self



    def c(self, val):

        def func():

            return self._c == val

        self.call_chain.append(func)

        return self



    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()


慕婉清6462132
浏览 151回答 1
1回答

FFIVE

诀窍是将函数的参数存储为调用链的一部分。最简单的方法是使用functools.partial对象。from functools import wraps, partialdef chain(func):    @wraps(func)    def wrapper(self, *args, **kwargs):        suspended = partial(func, self, *args, **kwargs)        self.call_chain.append(suspended)        return self    return wrapperclass 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 Truec = Test(True, False, 13)c.a(True).b(False).c(13).evaluate()  # Truec.a(True).b(False).c(11).evaluate()  # False
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python