35
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python] 特殊メソッドまとめ

Posted at

はじめに

個人的に特殊メソッドはわりと使うのですが、調べる度にいろんなサイトを参照している気がするので1つにまとめておきたいと思います。
特殊メソッドはそれぞれ実行される条件が違うのですが、大まかに分けると以下のようになるかと思います。

条件

  • 初期化
  • 組み込み関数
  • 算術演算子
    • 代数演算子
    • 代入演算子
  • 比較演算子
  • コンテナ(リストや辞書)操作
  • 属性操作
  • withステートメント

初期化

インスタンス作成時に実行されるメソッドです。__del__は削除時。

class Initialize:
    def __new__(cls):
        # インスタンス作成時
        print("New")
        return super().__new__(cls)

    def __init__(self):
        # インスタンス作成時
        print('Init')

    def __del__(self):
        # del オブジェクト のとき実行される
        del self
initialize = Initialize()
del initialize

New
Init

__new____init__の違いについては、こちらの記事をどうぞ。

組み込み関数

組み込みの関数によって実行されるメソッドです。

class BuiltIn:
    def __init__(self):
        self.__number = 10
        self.__string = 'Hello'

    def __bool__(self):
        # bool(オブジェクト)のとき
        import random
        random_number = random.randint(10,11)
        return self.__number == random_number
    
    def __bytes__(self):
        # bytes(オブジェクト)のとき
        return bytes(self.__string, encoding='utf-8')
    
    def __complex__(self):
        # complex(オブジェクト)のとき
        return complex(self.__number)
    
    def __float__(self):
        # float(オブジェクト)のとき
        return float(self.__number)
    
    def __int__(self):
        # int(オブジェクト)のとき
        return int(self.__number)

    def __str__(self):
        # str(オブジェクト)のとき
        return self.__string
    
    def __len__(self):
        # len(オブジェクト)のとき
        return len(self.__string)

    def __repr__(self):
        # repr(オブジェクト)のとき
        return f'{self.__string} World'
    
    def __hash__(self):
        # hash(オブジェクト)のとき
        return hash(self.__number)

    def __abs__(self):
        # abs(オブジェクト)のとき
        return abs(self.__number)
    
    def __format__(self, form_spec):
        # '{}'.format(オブジェクト)のとき
        return self.__string
builtin = BuiltIn()
print(bool(builtin))
print(bytes(builtin))
print(complex(builtin))
print(float(builtin))
print(int(builtin))
print(str(builtin))
print(len(builtin))
print(repr(builtin))
print(hash(builtin))
print('{} World'.format(builtin))

True
b'Hello'
(10+0j)
10.0
10
Hello
5
Hello World
10
Hello World

算術演算子

算術演算によって実行されるメソッドです。

代数演算子

通常の +、- などのような演算子によって実行されるメソッドです。

class Arithmetic:
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        # オブジェクト + オブジェクトのとき
        return self.x + other.x

    def __sub__(self, other):
        # オブジェクト - オブジェクトのとき
        return self.x - other.x

    def __mul__(self, other):
        # オブジェクト * オブジェクトのとき
        return self.x * other.x

    def __truediv__(self, other):
        # オブジェクト / オブジェクトのとき
        return self.x / other.x

    def __floordiv__(self, other):
        # オブジェクト // オブジェクトのとき
        return self.x // other.x

    def __mod__(self, other):
        # オブジェクト % オブジェクトのとき
        return self.x % other.x

    def __pow__(self, other):
        # オブジェクト ** オブジェクトのとき
        return self.x ** other.x

    def __and__(self, other):
        # オブジェクト & オブジェクトのとき
        return self.x & other.x

    def __xor__(self, other):
        # オブジェクト ^ オブジェクトのとき
        return self.x ^ other.x

    def __or__(self, other):
        # オブジェクト | オブジェクトのとき
        return self.x | other.x

    def __lshift__(self, other):
        # オブジェクト << オブジェクトのとき
        return self.x << other.x

    def __rshift__(self, other):
        # オブジェクト >> オブジェクトのとき
        return self.x >> other.x

    def __neg__(self):
        # +オブジェクトのとき
        return -self.x

    def __pos__(self):
        # -オブジェクトのとき
        return +self.x

a = Arithmetic(1)
b = Arithmetic(2)

print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a // b)
print(a % b)
print(a ** b)
print(a & b)
print(a | b)
print(a << b)
print(a >> b)
print(a ^ b)
print(+a)
print(-a)

3
-1
2
0.5
0
1
1
0
3
4
0
3
1
-1

代入演算子

+=、-= などのような演算子によって実行されるメソッドです。

class Arithmetic:
    def __init__(self, x):
        self.x = x

    def __iadd__(self, other):
        # オブジェクト += オブジェクトのとき
        self.x += other.x
        return self

    def __isub__(self, other):
        # オブジェクト -= オブジェクトのとき
        self.x -= other.x
        return self

    def __imul__(self, other):
        # オブジェクト *= オブジェクトのとき
        self.x *= other.x
        return self

    def __itruediv__(self, other):
        # オブジェクト /= オブジェクトのとき
        self.x /= other.x
        return self

    def __ifloordiv__(self, other):
        # オブジェクト //= オブジェクトのとき
        self.x //= other.x
        return self

    def __imod__(self, other):
        # オブジェクト %= オブジェクトのとき
        self.x %= other.x
        return self

    def __ipow__(self, other):
        # オブジェクト **= オブジェクトのとき
        self.x **= other.x
        return self

    def __iand__(self, other):
        # オブジェクト &= オブジェクトのとき
        self.x &= other.x
        return self

    def __ixor__(self, other):
        # オブジェクト ^= オブジェクトのとき
        self.x ^= other.x
        return self

    def __ior__(self, other):
        # オブジェクト |= オブジェクトのとき
        self.x |= other.x
        return self

    def __ilshift__(self, other):
        # オブジェクト <<= オブジェクトのとき
        self.x <<= other.x
        return self

    def __irshift__(self, other):
        # オブジェクト >>= オブジェクトのとき
        self.x >>= other.x
        return self
a = Arithmetic(1)
b = Arithmetic(2)

a += b
print(a.x)
a -= b
print(a.x)
a *= b
print(a.x)
a **= b
print(a.x)
a &= b
print(a.x)
a |= b
print(a.x)
a <<= b
print(a.x)
a >>= b
print(a.x)
a ^= b
print(a.x)
a /= b
print(a.x)
a //= b
print(a.x)
a %= b
print(a.x)

3
1
2
4
0
2
8
2
0
0.0
0.0
0.0

比較演算子

比較演算によって実行されるメソッドです。

class Comparison:
    def __init__(self, x):
        self.x = x

    def __eq__(self, other):
        # オブジェクト == オブジェクトのとき実行
        return self.x == other.x

    def __ne__(self, other):
        # オブジェクト != オブジェクトのとき実行
        return self.x != other.x

    def __lt__(self, other):
        # オブジェクト < オブジェクトのとき実行
        return self.x < other.x

    def __le__(self, other):
        # オブジェクト <= オブジェクトのとき実行
        return self.x <= other.x

    def __gt__(self, other):
        # オブジェクト > オブジェクトのとき実行
        return self.x > other.x

    def __ge__(self, other):
        # オブジェクト >= オブジェクトのとき実行
        return self.x >= other.x

cp_1 = Comparison(10)
cp_2 = Comparison(11)

print(cp_1 == cp_2)
print(cp_1 != cp_2)
print(cp_1 < cp_2)
print(cp_1 <= cp_2)
print(cp_1 > cp_2)
print(cp_2 >= cp_2)

False
True
True
True
False
True

コンテナ(リストや辞書)操作

リストや辞書の値を設定したり、取得したりするときに実行されるメソッドです。

class Container:
    def __init__(self, arr, dic=None):
        self.__arr = arr
        self.__dic = dic

    def __getitem__(self, key):
        # オブジェクト[key]のとき実行
        return self.__arr[key]	

    def __setitem__(self, key, value):
        # オブジェクト[key]=valueのとき実行
        self.__arr[key] = value
        return self

    def __delitem__(self, key):
        # del オブジェクト[key]のとき実行
        del self.__arr[key]
        return self

    def __iter__(self):
        # iter(オブジェクト)のとき実行
        return iter(self.__arr)

    def __contains__(self, item):
        # item in オブジェクト のとき実行
        return item in self.__dic

    def __reversed__(self):
        # reversed(オブジェクト)のとき実行
        return reversed(self.__arr)
container = Container([1,2,3,5], dic={"name":"hiroshi", "age":"28"})

print(len(container))
print(container[1])
container[1] = 7
print(container[1])
del container[1]
print(container[1])
print(list(iter(container)))
print('address' in container)
print(list(reversed(container)))

4
2
7
3
[1, 3, 5]
False
[5, 3, 1]

属性操作

オブジェクトの属性値を設定したり、取得したりするときに実行されるメソッドです。

class Attribute:
    def __setattr__(self, name, value):
        # 属性を追加するとき
        self.__dict__[name] = value

    def __getattr__(self, name):
        # 属性を取得するとき
        raise AttributeError("nothing...")

    def __delattr__(self, name):
        # 属性を削除するとき
        del self.__dict__[name]
    
    def __getattribute__(self, name):
        # 上記のような属性にアクセスするときを
        print("Hello")
        return super().__getattribute__(name)

attribute = Attribute()
attribute.x = 1
print(attribute.x)
del attribute.x

Hello
Hello
1
Hello

詳しくはこちらをどうぞ。

withステートメント

with文によって実行されるメソッドです。

class With:
    def __init__(self, x):
        self.x = x

    def __enter__(self):
        # with オブジェクト as obj: のとき実行
        self.x += 1
        print('enter', self.x)
        return self

    def __exit__(self, ex_type, ex_value, trace):
        # withの終わりで実行
        self.x += 1
        print(ex_type)
        print(ex_value)
        print(trace)
        print('exit', self.x)
with With(1) as w:
    print('hello')

enter 2
hello
None
None
None
exit 3

参考

[Pythonチートシート]特殊メソッド編
Pythonの特殊メソッド一覧を備忘録としてまとめてみた。
Python初心者でも__hoge__使いたい!〜特殊属性,特殊メソッドの使い方〜

まとめ

ここにあげたもの以外で便利なメソッドをご存じの方いましたらコメントいただけると嬉しいです。改めてまとめてみると勉強になった部分もあるので今後もこのようなまとめ記事を書いていけたらと思います。

35
57
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?