Pythonでのメソッドチェーンの使い方

3968 ワード

メソッドチェーン(method chaining)は、オブジェクト向けのプログラミング言語の一般的な構文であり、開発者がオブジェクトを一度だけ参照する場合に、同じオブジェクトを複数回メソッド呼び出しすることができる.例を挙げます.
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でメソッドチェーンをどのように使用しますか?みんなが大まかな考えを持っていると信じて、本文の述べがみんなの学習に役立つことを望んでいます.