DRYout基于类的可链接API

时间:2012-01-19 11:24:14

标签: python

我编写了一个可链接的API(与jQuery的风格类似),如下所示:

class ChainableAPI:
  def show(self):
    self.visibility = 1
    return self

  def goBlue(self):
    self.color = 'Blue'
    return self

  def die(self):
    self.life = 0
    return self

chainableAPI = ChainableAPI()

(chainableAPI
  .goBlue()
  .show()
  .die()
  .goBlue())

注意ChainableAPI的每个方法如何以return self结尾。有没有办法自动将所有方法都放到return self?这样我就不必为每种方法手动指定return self

1 个答案:

答案 0 :(得分:4)

你可以使用装饰者:

import functools

def chainable(func):
    @functools.wraps(func)
    def decorated(*args, **kwargs):
        func(*args, **kwargs)
        return args[0]
    return decorated

然后课程看起来像这样:

class Foo(object):
    @chainable
    def show(self):
        self.visibility = True

    @chainable
    def go_blue(self):
        self.color = 'blue'

但这比写return self更好吗?

此外,可以编写类装饰器以将chainable装饰器应用于不以_开头的所有方法:

def all_chainable(klass):
    for k, v in klass.__dict__.items():
        if not k.startswith('_') and callable(v):
            setattr(klass, k, chainable(v))
    return klass

示例:

@all_chainable
class Foo(object):
    def show(self):
        self.visibility = True

尽管如此,无论多酷,我仍然认为你应该只使用return self。但这显示了Python的强大功能。