(que no debe confundirse con itertools.chain)método de encadenamiento en Python
estaba leyendo el siguiente: http://en.wikipedia.org/wiki/Method_chaining
Mi pregunta es: cuál es la mejor manera de poner en práctica el método de encadenamiento en Python?
Aquí es mi intento:
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]
"""
Un problema es si llama method(*args)
modifica self.o
pero no vuelve None
. (entonces debo devolver self
o devolver lo que method(*args)
devuelve).
¿Alguien tiene mejores formas de implementar el encadenamiento? Probablemente haya muchas maneras de hacerlo.
¿Debo asumir que un método siempre devuelve None
por lo que siempre puedo devolver self.o
?
(tenga en cuenta que no estoy seguro de si el método de encadenamiento se debe utilizar en Python, pero todavía estoy interesado) –
Debe usar [funciones puras] (http://en.wikipedia.org/wiki/Pure_function) para que los métodos no modifican 'self.o' directamente, sino que devuelven la versión modificada. Además, '__getattr__' debería devolver una instancia de cadena. – reubano