【Python】「動的にメソッド実行」したいときはgetattr

初見の関数があらわれた

先日、同僚が書いたpythonコードを拝見していて、以下のような実装を見かけました。

class GroupList:
    def __init__(self, item, classifier, modifier) -> None:
    """
    基準に基づいてグループ化されたリストを初期化する

    Args:
        item         グループ化の対象リスト
        classifier   グループ化の基準
        modifier     平均値計算の基準
    """
        (...)

        avg = avg + getattr(employee, modifier)()

        (...)

「従業員」オブジェクトの平均年齢を求める処理の一部にあったこのgetattrという関数、初見だったので調べてみました。

getattrとは

getattr()はprint()などと同様、Pythonの組み込み関数のひとつです。以下のような構文で使用します。

getattr([インスタンス], [メソッド名])([引数...])

この関数を使うと、リスト内のメソッドを順番に呼び出すといった処理が効率的に行えます。

class MyClass:
    def __init__(self):
        print("Test of getattr")
 
    def add(self, x, y):
        return x + y
 
    def sub(self, x, y):
        return x - y
 
    def mult(self, x, y):
        return x * y
 
    def divs(self, x, y):
        return x / y

myclass = MyClass()
x = 6
y = 2
 
calc_list = ['add', 'sub', 'mult', 'divs']
 
# リスト内のメソッドを順に呼び出し
for calc in calc_list:
    result = getattr(myclass, calc)(x, y)
    txt = calc + "の演算結果:"
    print(txt, result)

(コード参照元:【Python】getattrの使い方

冒頭に示したコード例では、引数でメソッド名を指定し、それを実行するというような処理が行われていました。「動的なメソッド実行」をしたいときに真価を発揮しそうです。

参考リンク

返信がありません

コメントを残す

メールアドレスが公開されることはありません。