(da non confondere con itertools.chain)metodo di concatenamento in python
Stavo leggendo la seguente: http://en.wikipedia.org/wiki/Method_chaining
La mia domanda è: qual è il modo migliore per attuare il metodo concatenamento in Python?
Ecco il mio tentativo:
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 è se chiamate method(*args)
modifica self.o
ma non restituisce None
. (allora dovrei restituire self
o restituire cosa restituisce method(*args)
).
Qualcuno ha modi migliori per implementare il concatenamento? Ci sono probabilmente molti modi per farlo.
Devo solo supporre che un metodo restituisca sempre None
in modo che possa sempre restituire self.o
?
(nota che non sono sicuro che il metodo di concatenamento debba essere usato in python ma sono comunque interessato) –
Dovresti usare [pure funzioni] (http://en.wikipedia.org/wiki/Pure_function) in modo che i metodi non modificano 'self.o' direttamente, ma restituiscono la versione modificata. Inoltre, '__getattr__' dovrebbe restituire un'istanza di catena. – reubano