`return self`でメソッドチェーン

More than 5 years have passed since last update.

オープンソースを読んでいたらreturn selfしているメソッドがあって、これをやると何が起きるのか知らなかったのでメモ。

class Car1(object):

def __init__(self):
self.miles = 0
self.gas = 0

def drive(self, d):
self.miles += d
self.gas -= d
return self

def fill(self, g):
self.gas += g
return self

class Car2(object):
def __init__(self):
self.miles = 0
self.gas = 0

def drive(self, d):
self.miles += d
self.gas -= d

def fill(self, g):
self.gas += g

if __name__ == '__main__':
car1 = Car1()
car1.fill(100).drive(50)

print 'car1 miles', car1.miles
print 'car1 gas', car1.gas

car2 = Car2()
car2.fill(100).drive(50)

print 'car2 miles', car2.miles
print 'car2 gas', car2.gas


結果

car1 miles 50

car1 gas 50
Traceback (most recent call last):
File "chain.py", line 38, in <module>
car2.fill(100).drive(50)
AttributeError: 'NoneType' object has no attribute 'drive'

クラスのメソッドでreturn selfをしないCar2のインスタンスででメソッドチェーンをやろうとするとエラーが起きる。

return selfをやるとメソッドチェーンができるようになる。

car1なら何回fill()drive()をつなげても良い。


参考