「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):
in
とnot in
の判断式で呼ばれる関数。
他のダンダー
他にも色んなダンダーがあります。しかしMediumは記事内メニューの機能がなく、同じ記事に書き込むとバカ長くなるので、別々に書き込みます。次回は属性のアクセス関連ダンダーからです。完成次第公開します。
Pythonの公式ドキュメントにも全ダンダー記載されています、興味ある方はどうぞご覧ください。
if you like(this_article):
please(CLAPS)
follow(LSC_PSD)
# Thanks :)