Pythonダンダーメソッド入門

この記事では、マジックメソッドとしても知られるPythonダンダーメソッドについて簡単に解説します。
ダンダーメソッドとは?
ダンダーメソッドは、始めと終わりに2つのアンダースコア(__)が付いているPythonの特殊メソッドです。 このメソッドを使用することで、加算や減算、文字列表現など、組み込みの操作に対するオブジェクトの動作を定義することができます。
よくあるダンダーメソッドには、次が含まれます。
__init__(self, ...):オブジェクトの作成時に呼び出されます。- ObjectScriptの
%OnNewメソッドに似ています
- ObjectScriptの
__str__(self):オブジェクトを文字列として表現するために、str()組み込み関数とprintによって呼び出されます。__repr__(self):デバッグ用のオブジェクトを表現するために、repr()組み込み関数によって呼び出されます。__add__(self, other):+演算子が使用される際に呼び出されます。__len__(self):オブジェクトの長さを返すために、len()組み込み関数によって呼び出されます。__getitem__(self, key):インデックス構文を使用してコレクションからアイテムを取得するために呼び出されます。__setitem__(self, key, value):インデックス構文を使用してコレクション内にアイテムを設定するために呼び出されます。- ... 他にもたくさんあります。
IRIS環境において、ダンダーメソッドが重要であり関連性があるのはなぜか?
Objectscriptでは、Pythonのようなシンタックスシュガーはありませんが、ダンダーメソッドを使用して同じような動作を実現できます。
例えば、インポートしたPythonモジュールにPythonのリストを返す関数があり、Objectscriptでそれを使用したいとします。 リスト内のアイテムにアクセスするには、__getitem__ ダンダーメソッドを使用する必要があります。
# src/python/article/dunder_example.py
def get_list():
return [1, 2, 3, 4, 5]
Class Article.DunderExample Extends %RegisteredObject
{
ClassMethod Run()
{
Set sys = ##class(%SYS.Python).Import("sys")
do sys.path.append("/irisdev/app/src/python/article")
set dunderExample = ##class(%SYS.Python).Import("dunder_example")
set myList = dunderExample."get_list"()
for i=0:1:myList."__len__"()-1 {
write myList."__getitem__"(i), !
}
}
}
実行しましょう。
iris session iris -U IRISAPP '##class(Article.DunderExample).Run()'
出力は以下のようになります。
1
2
3
4
5
これは、IRIS環境でPythonオブジェクトとやり取りするためにダンダーメソッドを使う方法を具体的に示しており、ObjectScript環境内で作業しながらPythonの機能を活用することができます。
ボーナス
ダンダーの優れた使い方の1つは、スクリプトがモジュールとしてインポートされた際にコードが実行されないようにするために、if __name__ == "__main__": ブロックをPythonスクリプトの最後に配置することです。
最初の記事で、スクリプトをインポートするとコードが実行されることを説明しました。 このブロックにより、スクリプトがインポートされたときではなく、直接実行されたときにのみ実行されるコードを定義できます。
例:
# src/python/article/dunder_example.py
def get_list():
return [1, 2, 3, 4, 5]
if __name__ == "__main__":
print(get_list())
まとめ
ダンダーメソッドを使えば、PythonのシンタックスシュガーでできることはObjectScriptでも可能です。