干掉一个基于类的可链接API

2024-10-01 11:39:22 发布

您现在位置: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。你知道吗


Tags: 方法selfapireturn链接风格defshow
1条回答
网友
1楼 · 发布于 2024-10-01 11:39:22

你可以用一个装饰师:

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是多么强大。你知道吗

相关问题 更多 >