我编写了一个可链接的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
。
答案 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的强大功能。