【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)



【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)

Python学習初期に困惑しやすいダブルアンダースコアで記述される特殊メソッド。
参考書やWeb上のチュートリアルをみても理屈だけで、実際のコードはほぼ皆無。
そこで今回は「特殊メソッドを学びたい、知りたい」という方向けに、代表的な特殊メソッドのサンプルコードをご紹介します。
特殊メソッドの理解にお役立ていただければ幸いです。

目次
  1. 【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)
  2. 特殊メソッドとは
  3. 計算系の特殊メソッド
  4. 足し算の特殊メソッド ```__add__```
  5. 引き算の特殊メソッド ```__sub__```
  6. 掛け算の特殊メソッド ```__mul__```
  7. 割り算の特殊メソッド ```__truediv__```
  8. 割り算(切り捨て)の特殊メソッド ```__floordiv__```
  9. 加算「+=」の特殊メソッド ```__iadd__```
  10. 除算「-=」の特殊メソッド ```__isub__```
  11. 乗算「*=」の特殊メソッド ```__imul__```
  12. 除算「/=」の特殊メソッド ```__itruediv__```
  13. 比較系の特殊メソッド
  14. 等しい?の特殊メソッド ```__eq__```
  15. 等しくない? の特殊メソッド ```__ne__```
  16. < の特殊メソッド ```__lt__```
  17. > の特殊メソッド ```__qt__```
  18. <= の特殊メソッド ```__le__```
  19. >= の特殊メソッド ```__ge__```
  20. 型の変換で使う特殊メソッド群
  21. 文字列型に変換する特殊メソッド ```__str__```
  22. 数値型に変換する特殊メソッド ```__int__```
  23. シェルスクリプトで実行する特殊メソッド ```__repr__```
  24. 小数点型に変換する特殊メソッド ```__float__```
  25. .format()を使う時の特殊メソッド ```__format__```
  26. リストや辞書型利用時に使う特殊メソッド
  27. 組み込み関数len()利用時の特殊メソッド ```__len__```
  28. 辞書型使用時に活用したい特殊メソッド ```__getitem__```
  29. オブジェクトを辞書型のように扱いたい時の特殊メソッド ```__setitem__```
  30. 値を部分的に削除できる特殊メソッド ```__delitem__```
  31. 複数回処理を行うときの特殊メソッド ```__iter__```
  32. print(next(i))
  33. in 演算子を使う時の特殊メソッド ```__contains__```
  34. その他
  35. オブジェクトを削除する特殊メソッド ```__del__```
  36. クラスオブジェクトを関数化できる特殊メソッド ```__call__```
  37. まとめ

【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)

特殊メソッドとは

image

特殊メソッド(Special method)は、Pythonのクラス機能を用いる時に使うことができるテクニックの一つで、代表的な特殊メソッドに __init__ があります。

__init__ はクラス学習時に登場したコードで、初期化するために必要なメソッドとして習ったはず。どちらかというと呪文的に使っていたと思う __init__ ですが、実は他に便利そうな特殊メソッドもあります。 例えば、オブジェクトの等価をチェックできる特殊メソッドの __eq__

さっそく特殊メソッドがどれだけスゴイのか「特殊メソッドなし」の場合と「特殊メソッドあり」の場合で比較してみましょう。

python特殊メソッド

クラスを用いたオブジェクトの書き方が「なしの場合」と「ありの場合」で違うわけですが、特殊メソッドを使うとクラス内のメソッドを見るだけで何がしたいのかすぐに意味を理解することができ、可読性が向上します。また最終的な print 文を見ると、特殊メソッドを使っている場合は、関数名なしの == のみです。コードのエラーリスクを減らすことができますね。

このように特殊メソッドを使うメリットがある一方で、デメリットもあります。例えば、__eq の場合、等価対象数は基本 2つになります。3つ、4つのオブジェクトを等価チェックしたい場合は、特殊メソッドなしの方がスムーズかもしれません。 実際に手を動かして特殊メソッドを体験してみると、メリット・デメリットを実感できると思いますし、またPython初学者にとっては関数やリスト、辞書などのいい復習にもなります。

それでは以下に、代表的な特殊メソッドの例をご紹介していきたいと思います。

計算系の特殊メソッド

足し算の特殊メソッド __add__

class ADD():
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        return self.value + other.value + 1

x = ADD(10)
y = ADD(20)
print(x + y)

<< 結果 >>

image

引き算の特殊メソッド __sub__

class SUB():
    def __init__(self, value):
        self.value = value

    def __sub__(self, other):
        return self.value - other.value - 1

x = SUB(10)
y = SUB(20)
print(x - y)

<< 結果 >> image

掛け算の特殊メソッド __mul__

class MUL():
    def __init__(self, value):
        self.value = value

    def __mul__(self, other):
        return self.value * other.value * 2

x = MUL(10)
y = MUL(20)
print(x * y)

<< 結果 >>

image

割り算の特殊メソッド __truediv__

class TRUEDIV():
    def __init__(self, value):
        self.value = value

    def __truediv__(self, other):
        return self.value / other.value / 2

x = TRUEDIV(10)
y = TRUEDIV(20)
print(x / y)

<< 結果 >> image

割り算(切り捨て)の特殊メソッド __floordiv__

class FLOORDIV():
    def __init__(self, value):
        self.value = value

    def __floordiv__(self, other):
        return self.value // other.value

x = FLOORDIV(10)
y = FLOORDIV(3)
print(x // y)

<< 結果 >> image

加算「+=」の特殊メソッド __iadd__

class IADD():
    def __init__(self, val):
        self.val = val

    def __iadd__(self, other):
        self.val += other
        return self

x = IADD(1)
x += 3
print(x.val)
x += 3
print(x.val)

<< 結果 >> image

除算「-=」の特殊メソッド __isub__

class ISUB():
    def __init__(self, val):
        self.val = val

    def __isub__(self, other):
        self.val -= other
        return self

x = ISUB(5)
x -= 1
print(x.val)
x -= 1
print(x.val)

<< 結果 >> image

乗算「*=」の特殊メソッド __imul__

class IMUL():
    def __init__(self, val):
        self.val = val

    def __imul__(self, other):
        self.val *= other
        return self

x = IMUL(5)
x *= 2
print(x.val)
x *= 2
print(x.val)

<< 結果 >> image

除算「/=」の特殊メソッド __itruediv__

class ITRUEDIV():
    def __init__(self, val):
        self.val = val

    def __itruediv__(self, other):
        self.val /= other
        return self

x = ITRUEDIV(20)
x /= 2
print(x.val)
x /= 2
print(x.val)

<< 結果 >> image



比較系の特殊メソッド

等しい?の特殊メソッド __eq__

class EQ():
    def __init__(self, sample1):
        self.sample1 = sample1

    def __eq__(self, sample2):
        return self.sample1 == sample2

x = EQ('test')
y = EQ('TEST')
z = EQ('test')

print(x == y)
print(x == z)

<< 結果 >>

image

等しくない? の特殊メソッド __ne__

class EQ():
    def __init__(self, sample1):
        self.sample1 = sample1

    def __ne__(self, sample2):
        return self.sample1 != sample2 

x = EQ('test')
y = EQ('TEST')
z = EQ('test')

print(x != y)
print(x != z)

<< 結果 >>

image

< の特殊メソッド __lt__

class Test():
    def __init__(self, val):
        self.val = val

    def __lt__(self, other):
        return self.val < other.val

first = Test(1)
second = Test(2)
third = Test(3)
fourth = Test(4)

print(first < second)
print(fourth < third)
print(second < fourth)

<< 結果 >> image

> の特殊メソッド __qt__

class Test():
    def __init__(self, val):
        self.val = val

    def __gt__(self, other):
        return self.val > other.val

first = Test(1)
second = Test(2)
third = Test(3)
fourth = Test(4)

print(first > second)
print(fourth > third)
print(second > fourth)

<< 結果 >>

image

<= の特殊メソッド __le__

class Test():
    def __init__(self, val):
        self.val = val

    def __le__(self, other):
        return self.val <= other.val

first = Test(10)
second = Test(2)
third = Test(4)
fourth = Test(4)

print(first <= second)
print(fourth <= third)
print(second <= fourth)

<< 結果 >>

image

>= の特殊メソッド __ge__

class Test():
    def __init__(self, val):
        self.val = val

    def __ge__(self, other):
        return self.val >= other.val

first = Test(10)
second = Test(2)
third = Test(4)
fourth = Test(4)

print(first >= second)
print(fourth >= third)
print(second >= fourth)

<< 結果 >>

image



型の変換で使う特殊メソッド群

文字列型に変換する特殊メソッド __str__

class STR():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "名前:" + self.name + " 年齢:" + str(self.age)

x = STR('おおしま', 37)
print(x)

<< 結果 >>

image

数値型に変換する特殊メソッド __int__

class INT():
    def __init__(self, num):
        self.num = num

    def __int__(self):
        return int(self.num)

x = INT('11')
print(int(x)+1)

<< 結果 >> image

シェルスクリプトで実行する特殊メソッド __repr__

  • 呼び方: レパー
  • 備考 : シェルスクリプトのみで実行可能なコード
class Length():
    def __init__(self, data):
        self.data = data
    def __repr__(self):
        return "Length(%s, %s) " % (len(self.data), id(self))
    def __str__(self):
        return "Length(%s) " % (len(self.data))

l = Length([1,2,3])

l
print(l)

<< 結果 >> image


よく似た __int____repr__ の違いについては以下参照。

https://www.youtube.com/watch?v=aIdzBGzaxUo

簡単にいうと int は人間にとって読みやすい、 repr は、正確なデータ。


小数点型に変換する特殊メソッド __float__

class FLOAT():
    def __init__(self, val):
        self.val = val

    def __float__(self):
        return float(self.val)

p = FLOAT(1)
print(float(p))

<< 結果 >> image

.format()を使う時の特殊メソッド __format__

class FORMAT:
    def __init__(self, name, iso):
        self.name = name
        self.iso = iso

    def __format__(self, spec):
        if spec == 'short':
            return self.iso
        return self.name

country = FORMAT('Japan', 'JP')

print('{}'.format(country))
print('{:short}'.format(country))

<< 結果 >>

image



リストや辞書型利用時に使う特殊メソッド

組み込み関数len()利用時の特殊メソッド __len__

class LEN():
    def __init__(self, num):
        self.num = num

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

x = LEN([1,2,3,4,100])
print(len(x))

<< 結果 >> image

辞書型使用時に活用したい特殊メソッド __getitem__

あるキーを検出するとエラー文を出力するプログラム

class GETITEM():
    def __init__(self, items={}):
        self.items = items

    def __getitem__(self, key):
        if key == 'play':
            raise Exception('食事中に遊んじゃだめよ')
        return self.items.get(key)

x = GETITEM({'main':'たまご', 'sub':'ごはん', 'play': True})
print(x['play'])

<< 結果 >> image

オブジェクトを辞書型のように扱いたい時の特殊メソッド __setitem__

先ほどの getitem を利用してコード作成。

class GETITEM():
    def __init__(self, item={}):
        self.item = item

    def __getitem__(self, key):
        if key == 'play':
            raise Exception('食事中に遊んじゃだめよ')
        return self.item.get(key)

    def __setitem__(self, key, val):
        self.item[key] = val

x = GETITEM({'main':'たまご', 'sub':'ごはん', 'play': True})

print(x['sub'])
x['sub'] = ('おにぎり')
print(x['sub'])
x['drink'] = ('ジュース')
print(x.__dict__)

<< 結果 >>

image

オブジェクトを辞書型のように扱える、上書き、キーや値の追加などに。

値を部分的に削除できる特殊メソッド __delitem__

class DEL():
    def __delitem__(self, val):
        print('{}番目の値を消しました'.format(val))

x = DEL()
del x[3]

<< 結果 >> image

他にも deldelete がある。

複数回処理を行うときの特殊メソッド __iter__

  • 呼び方: Iterator(イテレータ)
  • 備考 : next とセットで使う
class ITER():
    def __init__(self, max = 0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration

x = ITER(2)
i = iter(x)
print(next(i))
print(next(i))
print(next(i))
#print(next(i))

<< 結果 >> image

in 演算子を使う時の特殊メソッド __contains__

class Contains(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __contains__(self, param1):
        return True if param1 in self.__dict__.keys() else False

p = Contains('おおしまたかゆき', 37)
print('名前は入力されてますか? ', 'name' in p)
print('入力されている項目:', p.__dict__)

<< 結果 >>

image



その他

オブジェクトを削除する特殊メソッド __del__

class DEL():
    def __del__(self):
        print('終了します')

end = DEL()
del end

<< 結果 >>

image

クラスオブジェクトを関数化できる特殊メソッド __call__

クラスを用いて作成したオブジェクトに機能追加できる

class CALL():
    def __init__(self, a):
        self.a = a

    def __call__(self, a, b):
        self.b = b
        return  a+b

text = 'Python'
x = CALL(text)
print(x.__dict__)
print(x(text, 'すき'))
print(x.__dict__)

<< 結果 >> image

まとめ

今回主要な特殊メソッドをご紹介しましたが、上記以外にもアトリビュートに関係する特殊メソッドや @classmethod などのクラスメソッドも存在。 Pythonを使ってWeb開発や仕事で使おうと考えている方は、「特殊メソッド」押さえておきたいですね。

尚、上記でご紹介した特殊メソッドには、関数やリスト、辞書型、クラスなど一通りのPython機能が登場しました。

特殊メソッド以前に「クラス? 辞書型?」という方、まずはPythonの基礎から固めてみませんか? CodeCamp では「オンライン&マンツーマン」方式で、効率よくPythonの基礎をマスターできるでしょう。

最後に今回ご紹介した特殊メソッド一覧をご紹介しますね。

特殊メソッド 内容
計算系
add(self, オブジェクト) 足し算
sub(self, オブジェクト) 引き算
mul(self, オブジェクト) 掛け算
truediv(self, オブジェクト) 割り算
floordiv(self, オブジェクト) 割り算(切り捨て型)
and(self, オブジェクト) ビット演算子の&
or(self, オブジェクト) ビット演算子の
iadd(self, オブジェクト) += (a += b は a = a + b)
isub(self, オブジェクト) -=
imul(self, オブジェクト) *=
itruediv(self,オブジェクト) /=
比較系
eq(self, オブジェクト) 等しい?
ne(self, オブジェクト) 違う?
lt(self, ●●) self < ●● ?
gt(self, ●●) self > ●● ?
le(self, ●●) Self <= ●● ?
ge(self, ●●) Self >= ●● ?
型の変換系
int(self) 整数型へ
float(self) 小数点型へ
str(self) オブジェクトを文字列型に
repr(self) インスタンスを文字列型に
format(self, form_spec) 文字列フォーマット実行時に
リストや辞書型に
len(self) len()
getitem(self, キー) 要素の参照に
setitem(self, キー, 要素) 引数使用時に
delitem(self, キー) 要素の削除に
iter(self) 組み込み関数利用時に
contains(self, 要素) 比較演算子 in 使用時に
アトリビュートに
getattr(self, アトリビュート名) 未設定のアトリビュートが参照される時
getatteribute(self, アトリビュート名) すべてのアトリビュートが参照される時
setattr(self, アトリビュート名, 要素) アトリビュートへの代入時に
その他
call(self[, args…]) オブジェクトを関数のように呼ぶ時
dell(self) オブジェクトを消す時

関連記事

オシママサラ
この記事を書いた人
オシママサラ
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp