【Pythonを使い倒す】特殊なメソッドを活用してキレイなコードを書こう!

前回の記事では、既存のクラスを継承して好きなようにカスタマイズできる方法を解説をしました。今回は特殊なメソッドを解説します。
Pythonには特殊なメソッドがいくつかあります。
いくつか実装してみよう。

__str__()メソッド

前後にアンダーバー(_)が2つずつある__str__()メソッドをクラス内に実装すると、str関数の( )内にインスタンスを渡した際に文字列を返り値として得ることができます。
※インスタンスについての記事はこちら

__str__()メソッド
class Fruit1:
    def __str__(self):
        return "This is a pen."
    
f1 = Fruit1()
print(str(f1)) # str()関数にインスタンスを渡す
実行結果

This is a pen.

こちらのクラスFruit1をみていきましょう。
この中には__str__()メソッドを実装しています。
このメソッドは文字列を返り値として返します。

このクラスFruit1からインスタンスを生成し、そのインスタンスをstr()関数に渡してやります。

そうすると上記のような”This is a pen.”が表示される実行結果となります。

このようにクラス内に__str__()メソッドを実装するとインスタンスから__str__()メソッドを用いて文字列を得ることができるようになります。

__call__()メソッド

前後にアンダーバー(_)が2つずつある__call__()メソッドをクラス内に実装すると、インスタンスを関数のように扱うことができます

__call__()メソッド
class Dog:
    color = "brown"
    
    def bark(self):
        print("Bow-wow!")
        
dog = Dog()
print(dog.color)
dog.bark()
実行結果

りんごりんごりんごりんごりんごバナナバナナバナナ

こちらのクラスFruit2には__call__()メソッドが実装されています。
引数として、selfの他に f と a を受け取っています。
fを5倍して、aを3倍にして足し合わせています。

そして、Fruit2のインスタンスを生成して、インスタンス名の直後に括弧()を書いて、括弧()の中に引数を2つ渡しています。
この中には”りんご”という文字列と”バナナ”という文字列を渡しています。

実行すると、上記のように”りんご”が5つと”バナナ”が3つを結合した文字列が表示されます。

インスタンスを関数のように扱い処理を渡すことができました。
このように__call__()メソッドを実装するとメソッド名を書かずにインスタンス自体を関数のように扱う事ができます。

なお、以前ご紹介したコンストラクタに用いた__init__()も特殊なメソッドです。
他にもいくつか特殊なメソッドがありますので、興味のある方は調べてみてくださいね。

特殊なメソッドの実行手順は以下のようになります。

  1. __str__メソッド、__call__メソッドなどを含むクラスを記述してみよう
  2. str関数にインスタンスを渡して、文字列を取得できるかを確認
  3. インスタンスを関数のように扱ってみよう!

今回は特殊なメソッドを解説しました。
とりあえず、Python には様々な特殊なメソッドがあるということを覚えておきましょう。