Pythonでのメソッドチェーンの使い方
3968 ワード
メソッドチェーン(method chaining)は、オブジェクト向けのプログラミング言語の一般的な構文であり、開発者がオブジェクトを一度だけ参照する場合に、同じオブジェクトを複数回メソッド呼び出しすることができる.例を挙げます.
2つの方法――barとbazを含むFooクラスがあると仮定します.
Fooクラスのインスタンスを作成します.
メソッドチェーンを使用しないで、オブジェクトfooのbarとbazメソッドを連続的に呼び出すには、次のようにします.
メソッドチェーンを使用すれば、foo.bar().baz()
メソッドチェーンの利点の1つは、オブジェクト名を使用する回数を減らすことです.呼び出す方法が多ければ多いほど、減らすことができる回数が多くなります.従って、この方法は、読み取り、テスト、デバッグ、メンテナンスを必要とするコードの数をある程度減らすことができる.これはあまりメリットがありませんが、役に立ちます.
メソッドチェーンの1つの制限は、selfオブジェクトを返す必要があるため、他の値を返す必要がないメソッドでのみ使用できます.Pythonが1つのreturn文で複数の値を返すことをサポートしても、この問題は解決できない可能性があります.
以下に、Pythonにおける方法チェーンの一例を示す.
上のような実現は簡単すぎるかもしれません.文字列ハンドラstring_を記述するより現実的な方法チェーンの使用方法を見てみましょう.processor.py、メソッドチェーンをサポートします.
このプログラムの実行結果は次のとおりです.
以上から,メソッドチェーンは有用であるが,過度に使用するとあまりよくない可能性があることが分かった.
Pythonでメソッドチェーンをどのように使用しますか?みんなが大まかな考えを持っていると信じて、本文の述べがみんなの学習に役立つことを望んでいます.
2つの方法――barとbazを含むFooクラスがあると仮定します.
Fooクラスのインスタンスを作成します.
foo = Foo()
メソッドチェーンを使用しないで、オブジェクトfooのbarとbazメソッドを連続的に呼び出すには、次のようにします.
foo.bar() # Call method bar() on object foo.
foo.baz() # Call method baz() on object foo.
メソッドチェーンを使用すれば、foo.bar().baz()
メソッドチェーンの利点の1つは、オブジェクト名を使用する回数を減らすことです.呼び出す方法が多ければ多いほど、減らすことができる回数が多くなります.従って、この方法は、読み取り、テスト、デバッグ、メンテナンスを必要とするコードの数をある程度減らすことができる.これはあまりメリットがありませんが、役に立ちます.
メソッドチェーンの1つの制限は、selfオブジェクトを返す必要があるため、他の値を返す必要がないメソッドでのみ使用できます.Pythonが1つのreturn文で複数の値を返すことをサポートしても、この問題は解決できない可能性があります.
以下に、Pythonにおける方法チェーンの一例を示す.
class Person:
def name(self, value):
self.name = value
return self
def age(self, value):
self.age = value
return self
def introduce(self):
print "Hello, my name is", self.name, "and I am", self.age, "years old."
person = Person()
person.name("EarlGrey").age(21).introduce()
# => Hello, my name is EarlGrey and I am 21 years old.
上のような実現は簡単すぎるかもしれません.文字列ハンドラstring_を記述するより現実的な方法チェーンの使用方法を見てみましょう.processor.py、メソッドチェーンをサポートします.
import copy
class StringProcessor(object):
'''
A class to process strings in various ways.
'''
def __init__(self, st):
'''Pass a string for st'''
self._st = st
def lowercase(self):
'''Make lowercase'''
self._st = self._st.lower()
return self
def uppercase(self):
'''Make uppercase'''
self._st = self._st.upper()
return self
def capitalize(self):
'''Make first char capital (if letter); make other letters lower'''
self._st = self._st.capitalize()
return self
def delspace(self):
'''Delete spaces'''
self._st = self._st.replace(' ', '')
return self
def rep(self):
'''Like Python's repr'''
return self._st
def dup(self):
'''Duplicate the object'''
return copy.deepcopy(self)
def process_string(s):
print
sp = StringProcessor(s)
print 'Original:', sp.rep()
print 'After uppercase:', sp.dup().uppercase().rep()
print 'After lowercase:', sp.dup().lowercase().rep()
print 'After uppercase then capitalize:', sp.dup().uppercase().\
capitalize().rep()
print 'After delspace:', sp.dup().delspace().rep()
def main():
print "Demo of method chaining in Python:"
# Use extra spaces between words to show effect of delspace.
process_string('hOWz It GoInG?')
process_string('The QUIck brOWn fOx')
main()
このプログラムの実行結果は次のとおりです.
$ python string_processor.py
Original: hOWz It GoInG?
After uppercase: HOWZ IT GOING?
After lowercase: howz it going?
After uppercase then capitalize: Howz it going?
After delspace: hOWzItGoInG?
Original: The QUIck brOWn fOx
After uppercase: THE QUICK BROWN FOX
After lowercase: the quick brown fox
After uppercase then capitalize: The quick brown fox
After delspace: TheQUIckbrOWnfOx
以上から,メソッドチェーンは有用であるが,過度に使用するとあまりよくない可能性があることが分かった.
Pythonでメソッドチェーンをどのように使用しますか?みんなが大まかな考えを持っていると信じて、本文の述べがみんなの学習に役立つことを望んでいます.