def __Dunder__: 知ったら得するPythonのダンダー (属性編)

Neil Wu
LSC PSD
Published in
4 min readMay 7, 2020

「Everything is an Object」、Pythonエンジニアには馴染みのある一言。何もかもクラスに書き込んで、華麗に継承し合うするのがPythonエンジニアのロマン(いたずら)と言っても過言ではない。
そのクラスの中でいつも出てくる__init__の使い方は知ってると思いますが、他に時々見かける__xxxx__の関数は一体なんなのか、こういう関数がいくらあるか、悩んだことはありますか?今日はよく見る__dunder__属性値アクセス、デスクリプタ、コンテイナーについて紹介させていただきます。

属性値アクセス

def __getattr__(self, attr):

クラス内に存在しない属性へのアクセス。AttributeError が発生する状況で対応してくれる関数です。

def __getattribute__(self, attr):

クラス内のすべての属性へのアクセス。AttributeError の発生とは関係なく、class.attr を使ったすべての属性アクセスの時に動作する関数です。例えば属性を隠したい時__getattribute__で外部からのアクセスをブロックすることができます。

def __setattr__(self, att, value):

属性宣告で使う関数。クラス内で別のクラスを扱う状況とかで活躍する関数です。

def __delattr__(self, att):

属性を削除する関数。属性が削除された後、属性にアクセスしたい時は__getattr__ 関数を呼び出します。

def __dir__(self, att):

インスタンスにdir()を使った時呼ぶ関数する関数。シーケンスを戻り値にしなければなりません。

デスクリプタ

オーナークラスに存在するときのみに適用されルダンダー達です。

def __get__(self, instance, owner):

オーナークラス内からインスタンスを呼ぶ時。

def __set__(self, instance, value):

オーナークラス内からインスタンスの属性に値を与える時。

def __delete__(self, instance):

オーナークラス内からインスタンスの属性を削除する時。

コンテイナー

def __len__(self):

インスタンスにlen()を使った時呼ぶ関数。戻り値は必ず整数(int )形式。

def __getitem__(self, key):

self[key] の数値を呼ぶときに使う関数。

def __setitem__(self, key, value):

self[key] に数値を与える時に使う関数。

def __delitem__(self, key):

self[key] を削除する時に使う関数。

def __iter__(self):

for ループの時yield で一つ一つ戻り値にする関数。

def __contains__(self, item):

innot in の判断式で呼ばれる関数。

他のダンダー

他にも色んなダンダーがあります。しかしMediumは記事内メニューの機能がなく、同じ記事に書き込むとバカ長くなるので、別々に書き込みます。次回は属性のアクセス関連ダンダーからです。完成次第公開します。

Pythonの公式ドキュメントにも全ダンダー記載されています、興味ある方はどうぞご覧ください。

if you like(this_article):
please(CLAPS)
follow(LSC_PSD)
# Thanks :)

--

--