Python 特殊メソッド

Python学習【365日チャレンジ!】88日目のマスターU(@Udemy11)です。

ちょっと遠出してウォーキングでラムーまで散歩に行ったら、チャーシューを作るのにめちゃくちゃ良さげな豚ロースと大きくて葉がしっかりと詰まったキャベツがあったので、思わず買ってしまいました。

両手に買い物袋をぶら下げつつ早足気味のウォーキングで帰ったのですが、ちょっと距離があったので、両手が筋肉痛になってしまいました。

明日は、チャーシュー作りに精を出そうと思います。

それではさっそくPython学習をはじめましょう!

昨日の復習

昨日は、クラスメソッドとあまり使うことのないスタティックメソッドを学習しました。

クラスメソッドは、クラスからオブジェクト(インスタンス)を生成しなくても使えるメソッドで、スタティックメソッドも同様に、オブジェクトを生成しなくても使うことのできるメソッドでした。

class Animals:

    kind = 'cat'

    @classmethod
    def what_is_this(cls):
        return cls.kind

    @staticmethod
    def about(country):
        print('about animal {}'.format(country))

Animals.about('Japan')
print(Animals.what_is_this())

出力結果

about animal Japan
cat

スタティックメソッドの場合は、クラス内に置かなくても、クラスの外に@staticmethodをつけずに記述すれば、普通にメソッドとして扱うことができるので、あまり使うことがないということでしたね。

より詳しい内容は、昨日の記事で確認してみてください。

それでは本日の学習をすすめましょう!

特殊メソッド

特殊メソッドは__(アンダーバー2つ)で囲まれたメソッドのことで、これまでに学習した__init__が代表的な特殊メソッドです。

__init__は、オブジェクトを生成した際に、最初に読み込まれて、オブジェクトを初期化するメソッドです。

このように、クラスから生成されるオブジェクトに何らかの処理を呼び出したときに自動的に実行されるメソッドが特殊メソッドです。

class People:
    def __init__(self, name):
        self.name = name

例えば、このコードは、引数nameをクラス変数nameに代入するという初期化をしています。

ここまで学習してきた方なら、もうおなじみのメソッドですね。

そんな特殊メソッドの中でも代表的なよく使うメソッドを紹介していきます。

__str__

__str__が最もよく使う特殊メソッドで、オブジェクトを生成して、print()関数が使われるときに呼び出されるメソッドです。

class Animal:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return 'bow bow this is {}'.format(self.name)

dog = Animal('dog')
print(dog)

出力結果

bow bow this is dog

生成したオブジェクトdogを出力すると__str__が呼び出されて戻り値が自動的に返されています。

str()関数、format()関数を実行したときにも自動的に__str__が呼び出されるようです。

__len__

__len__は、長さを求める組み込み関数len()を呼び出したときに実行される特殊メソッドです。

class Animal:
    def __init__(self, name):
        self.name = name

    def __len__(self):
        return len(self.name)

c = Animal('cat')
print(len(c))

出力結果

3

Animalクラスからcatを引数にしたcオブジェクトを生成して、そのcの長さを出力しているわけですが、len()を呼び出したことで、__len__メソッドが実行されて、引数catの長さが返されています。

__add__

__add__はオブジェクトを2つ生成して、その2つを足し合わせるといった使い方ができます。

class Animal:
    def __init__(self, name):
        self.name = name

    def __add__(self, other):
        return self.name + ':' + other.name

c = Animal('cat')
d = Animal('dog')
print(c + d)

出力結果

cat:dog

Animalクラスから生成されたオブジェクトcの引数catとオブジェクトdの引数dogを:(コロン)を挟んで+でくっつけています。

引数が数字の場合は、次のように少しコードを変更すれば、普通に足し算をした結果が出力されます。

class Num:
    def __init__(self, num1):
        self.num = num1

    def __add__(self, num2):
        return self.num + num2.num

c = Num(10)
d = Num(100)
print(c + d)

出力結果

110

__eq__

__eq__は同じクラスから生成されたオブジェクトのクラス変数が同じかどうかを判断するときに使われるので、==がオブジェクトで呼び出されたときに実行され、TrueFalseを返してくれます。

class Animal:
    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        return self.name == other.name

c = Animal('cat')
d = Animal('cat')
print(c == d)

出力結果

True

もちろん、9行目のcatdogに変更すれば、出力結果はFalseになります。

その他の特殊メソッド

その他の特殊メソッドで演算子に関する処理を呼び出したときに実行されるメソッドがこちら。

  • __sub__(self,オブジェクト):引き算(-)を行うときに実行されるメソッド
  • __mul__(self,オブジェクト):掛け算(*)を行うときに実行されるメソッド
  • __truediv__(self,オブジェクト):割り算(/)を行うときに実行されるメソッド
  • __and__(self,オブジェクト):AND条件(&)を使うときに実行されるメソッド
  • __or__(self,オブジェクト):OR条件(|)を使うときに実行されるメソッド
  • __ne__(self,オブジェクト):含まれない条件(!=)を使うときに実行されるメソッド
  • __lt__(self,オブジェクト):小なり条件(<)を使うときに実行されるメソッド
  • __gt__(self,オブジェクト):大なり条件(>)を使うときに実行されるメソッド

型の変換に関する関数を実行するときに使われるメソッドがこちら。

  • __int__(self):int関数を使うときに実行されるメソッド
  • __float__(self):float関数を使うときに実行されるメソッド

複数の値を持つ型の処理を実行するときに使われるメソッドがこちら。

  • __len__(self):len関数を呼び出したときに実行されるメソッド
  • __getitem__(self,key):値を参照するときに実行されるメソッド
  • __setitem__(self,key):引数のkeyに要素を代入するときに実行されるメソッド
  • __delitem__(self,key):del文が呼び出されたときに実行されるメソッド
  • __iter__(self):iter関数を呼び出したときに実行されるメソッド
  • __conteins__(self):比較演算子のinが使われたときに実行されるメソッド

これら以外の特殊メソッドもありますが、最も使用頻度の高い特殊メソッドは__init__で、次に来るのは__str__じゃないかということでしたので、その他の特殊メソッドは、そんなに真剣に覚えておかなくても問題はないのかなと思います。

オブジェクトとクラスが終了

今日まででようやくオブジェクトとクラスのチャプターが終了しました。

長かったような短かったような、どちらとも言えない感じですが、すでに最初の頃に学習した内容は、頭から抜け落ちてしまっているものもたくさんあると思います。

かなり時間をかけて学習してきたつもりですが、それでも学習した内容を完璧に覚えているものは数えるくらいしかありません。

実践はまだ少し先のようですので、しっかりと復習しつつ、明日以降のファイル操作とシステムについて学習を進めていこうと思います。

それでは、明日もGood Python!