Pythonでメソッドチェーンを作成

Python

こんにちは!ウメハラ(plumfield56)です。

この記事ではメソッドチェーンの書き方を紹介します。

メソッドチェーンとは???

一言でいうとメソッドの後ろに続けてメソッドを書くことです。

Class().method().method().method()

みたいな感じでメソッドをつなげて書く書き方です。

クラスの書き方

まずは基本的なクラスの書き方から見ていきます。

class AddText:
  def __init__(self):
    self.text = ''

  def add(self, add_text):
    self.text += add_text
    return self.text

a = AddText()
a.add('test')
a.add('_test')
# test_test

__init__はクラスのインタンス時の1回のみ呼び出される特殊メソッドです。
AddTextクラスで作成したaddメソッドを呼ぶたびにテキストが追加されていきます。

ただしこれだと下記のようにメソッドをつなげたときにエラーが出てしまいます。

a = AddText()
a.add('test').add('_test')

この問題を解決するのにメソッドチェーンを使います。

メソッドチェーンの書き方

上記で書いているselfをreturnしてあげればOKです。

class AddText:
  def __init__(self):
    self.text = ''

  def add(self, add_text):
    self.text += add_text
    return self


a = AddText()
a.add('test').add('_test')
# <__main__.AddText at 0x...>

これでエラーなく実行できました。
ただよくわからない表記が出てきてしまいましたで下記に変更してテキストを返せしてみます。

class AddText:
  def __init__(self):
    self.text = ''

  def add(self, add_text):
    self.text += add_text
    return self


a = AddText()
a.add('test').add('_test').text
# test_test

これでちゃんとうまくいってることが確認できました。
ただ、毎回textを付けるのがめんどうなので特殊メソッドを使って出力される内容を変えていきます。

__repr__メソッド

特殊メソッドはたくさんありますが、まずはrepr(レパー)メソッドを使っていきます。
これはPower Shellでの表記を変えてくれるメソッドだそうです。

つまりprintの表示やJupyter NotebookやGoogle Colaboratoryでprintを付けなくても最後に記入している変数が表示されるやつです。(多分)

実際に試してみたいと思います。

class AddText:
  def __init__(self):
    self.text = ''

  def add(self, add_text):
    self.text += add_text
    return self

  def __repr__(self):
    return self.text

a = AddText()
a.add('test').add('_test')

# test_test

これで問題なく表示できました。
reprメソッドでも戻り値はテキストでないとエラーになってしまうので気をつけてください。

DataFrameはどうなってるの???

ここで疑問がでてきます。
DataFrameの表示はどうなっているのか?
テキストしか表示できないはずではないのか???

そんな疑問を持って調べてしてみました。
結論、テキストをHTMLに変更して表示させているみたいです。

IPython.displayというライブラリを使うとHTML表示が可能だということです。

これをクラス内で作成して戻り値にしているからDataFrameは表が表示されているのではないかと思っています。

コメント

タイトルとURLをコピーしました