- 更新日: 2018年06月28日
- 公開日: 2018年06月14日
【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)
Python学習初期に困惑しやすいダブルアンダースコアで記述される特殊メソッド。
参考書やWeb上のチュートリアルをみても理屈だけで、実際のコードはほぼ皆無。
そこで今回は「特殊メソッドを学びたい、知りたい」という方向けに、代表的な特殊メソッドのサンプルコードをご紹介します。
特殊メソッドの理解にお役立ていただければ幸いです。
- 【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)
- 特殊メソッドとは
- 計算系の特殊メソッド
- 足し算の特殊メソッド ```__add__```
- 引き算の特殊メソッド ```__sub__```
- 掛け算の特殊メソッド ```__mul__```
- 割り算の特殊メソッド ```__truediv__```
- 割り算(切り捨て)の特殊メソッド ```__floordiv__```
- 加算「+=」の特殊メソッド ```__iadd__```
- 除算「-=」の特殊メソッド ```__isub__```
- 乗算「*=」の特殊メソッド ```__imul__```
- 除算「/=」の特殊メソッド ```__itruediv__```
- 比較系の特殊メソッド
- 等しい?の特殊メソッド ```__eq__```
- 等しくない? の特殊メソッド ```__ne__```
- < の特殊メソッド ```__lt__```
- > の特殊メソッド ```__qt__```
- <= の特殊メソッド ```__le__```
- >= の特殊メソッド ```__ge__```
- 型の変換で使う特殊メソッド群
- 文字列型に変換する特殊メソッド ```__str__```
- 数値型に変換する特殊メソッド ```__int__```
- シェルスクリプトで実行する特殊メソッド ```__repr__```
- 小数点型に変換する特殊メソッド ```__float__```
- .format()を使う時の特殊メソッド ```__format__```
- リストや辞書型利用時に使う特殊メソッド
- 組み込み関数len()利用時の特殊メソッド ```__len__```
- 辞書型使用時に活用したい特殊メソッド ```__getitem__```
- オブジェクトを辞書型のように扱いたい時の特殊メソッド ```__setitem__```
- 値を部分的に削除できる特殊メソッド ```__delitem__```
- 複数回処理を行うときの特殊メソッド ```__iter__```
- print(next(i))
- in 演算子を使う時の特殊メソッド ```__contains__```
- その他
- オブジェクトを削除する特殊メソッド ```__del__```
- クラスオブジェクトを関数化できる特殊メソッド ```__call__```
- まとめ
【Python入門】クラス利用時の特殊メソッド一覧(サンプルコード付き)
特殊メソッドとは
特殊メソッド(Special method)は、Pythonのクラス機能を用いる時に使うことができるテクニックの一つで、代表的な特殊メソッドに __init__
があります。
__init__
はクラス学習時に登場したコードで、初期化するために必要なメソッドとして習ったはず。どちらかというと呪文的に使っていたと思う __init__
ですが、実は他に便利そうな特殊メソッドもあります。
例えば、オブジェクトの等価をチェックできる特殊メソッドの __eq__
。
さっそく特殊メソッドがどれだけスゴイのか「特殊メソッドなし」の場合と「特殊メソッドあり」の場合で比較してみましょう。
クラスを用いたオブジェクトの書き方が「なしの場合」と「ありの場合」で違うわけですが、特殊メソッドを使うとクラス内のメソッドを見るだけで何がしたいのかすぐに意味を理解することができ、可読性が向上します。また最終的な 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)
<< 結果 >>
引き算の特殊メソッド __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)
<< 結果 >>
掛け算の特殊メソッド __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)
<< 結果 >>
割り算の特殊メソッド __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)
<< 結果 >>
割り算(切り捨て)の特殊メソッド __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)
<< 結果 >>
加算「+=」の特殊メソッド __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)
<< 結果 >>
除算「-=」の特殊メソッド __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)
<< 結果 >>
乗算「*=」の特殊メソッド __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)
<< 結果 >>
除算「/=」の特殊メソッド __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)
<< 結果 >>
比較系の特殊メソッド
等しい?の特殊メソッド __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)
<< 結果 >>
等しくない? の特殊メソッド __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)
<< 結果 >>
< の特殊メソッド __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)
<< 結果 >>
> の特殊メソッド __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)
<< 結果 >>
<= の特殊メソッド __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)
<< 結果 >>
>= の特殊メソッド __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)
<< 結果 >>
型の変換で使う特殊メソッド群
文字列型に変換する特殊メソッド __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)
<< 結果 >>
数値型に変換する特殊メソッド __int__
class INT():
def __init__(self, num):
self.num = num
def __int__(self):
return int(self.num)
x = INT('11')
print(int(x)+1)
<< 結果 >>
シェルスクリプトで実行する特殊メソッド __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)
<< 結果 >>
よく似た __int__
と __repr__
の違いについては以下参照。
簡単にいうと 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))
<< 結果 >>
.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))
<< 結果 >>
リストや辞書型利用時に使う特殊メソッド
組み込み関数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))
<< 結果 >>
辞書型使用時に活用したい特殊メソッド __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'])
<< 結果 >>
オブジェクトを辞書型のように扱いたい時の特殊メソッド __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__)
<< 結果 >>
オブジェクトを辞書型のように扱える、上書き、キーや値の追加などに。
値を部分的に削除できる特殊メソッド __delitem__
class DEL():
def __delitem__(self, val):
print('{}番目の値を消しました'.format(val))
x = DEL()
del x[3]
<< 結果 >>
他にも del や delete がある。
複数回処理を行うときの特殊メソッド __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))
<< 結果 >>
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__)
<< 結果 >>
その他
オブジェクトを削除する特殊メソッド __del__
class DEL():
def __del__(self):
print('終了します')
end = DEL()
del end
<< 結果 >>
クラスオブジェクトを関数化できる特殊メソッド __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__)
<< 結果 >>
\AIエンジニアに必要なスキルが身に付く/
まとめ
今回主要な特殊メソッドをご紹介しましたが、上記以外にもアトリビュートに関係する特殊メソッドや @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) | オブジェクトを消す時 |
- この記事を書いた人
- オシママサラ