链接(不要与itertools.chain混淆)方法蟒蛇
我读了以下内容: http://en.wikipedia.org/wiki/Method_chaining
我的问题是:什么是在Python中实现方法链的最佳方式?
这里是我的尝试:
class chain():
def __init__(self, my_object):
self.o = my_object
def __getattr__(self, attr):
x = getattr(self.o, attr)
if hasattr(x, '__call__'):
method = x
return lambda *args: self if method(*args) is None else method(*args)
else:
prop = x
return prop
list_ = chain([1, 2, 3, 0])
print list_.extend([9, 5]).sort().reverse()
"""
C:\Python27\python.exe C:/Users/Robert/PycharmProjects/contests/sof.py
[9, 5, 3, 2, 1, 0]
"""
的一个问题是,如果在调用method(*args)
修改self.o
但不返回None
。 (那么我应该返回self
还是返回method(*args)
返回)。
有没有人有更好的方法来实现链接?可能有很多方法可以做到这一点。
我应该假设一个方法总是返回None
,所以我总是可以返回self.o
?
(注意,我不确定是否应该在Python中使用方法链接,但我仍然感兴趣) –
您应该使用[纯函数](http://en.wikipedia.org/wiki/Pure_function),以便方法不直接修改'self.o',而是返回修改后的版本。另外'__getattr__'应该返回一个链式实例。 – reubano