こんにちは。
現役エンジニアの”はやぶさ”@Cpp_Learningです。
Pythonの組込み関数 getattr の使い方を勉強したので備忘録も兼ねて本記事を書きます。
Contents
getattrとは
getattr()は Python組込み関数 の一つです(お馴染みprint()も組込み関数です)
基本的な使い方は以下の通りです。
1 2 3 |
戻り値 = getattr(インスタンス, メソッド名)(引数1) |
引数や戻り値の数(無い場合もある)は、インスタンス(クラス)に依存します。
print()同様にモジュールのimportは不要です。
実践!getattrを使ったPythonプログラミング
いくつかgetattrを使ったソースコードを書いてみます。
サンプルコード❶ -基本-
四則演算クラスとgetattrを使ったサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 result = getattr(myclass, 'add')(x, y) print("addの演算結果:", result) result = getattr(myclass, 'sub')(x, y) print("subの演算結果:", result) result = getattr(myclass, 'mult')(x, y) print("multの演算結果:", result) result = getattr(myclass, 'divs')(x, y) print("divsの演算結果:", result) |
つまり、下記のコードの resutu_1 と result_2 はどちらもaddの演算をしています。
1 2 3 4 |
result_1 = myclass.add(2, 3) result_2 = getattr(myclass, 'add')(2, 3) |
正直、このサンプルコードだけだと getattr を使う理由がイマイチ分からないと思います。
サンプルコード❷ -for文と組み合わせる-
getattrとfor文を組み合わせたサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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) |
呼び出すメソッドをリスト(calc_list)にしてループ処理すれば、getattr1つでリスト内のメソッドを順番に呼び出すことができます。
サンプルコード➌ -深層学習にも使えそう-
Pytorchとgetattrを組み合わせたサンプルコード
1 2 3 4 5 |
from torchvision import models # net = models.vgg16(pretrained=True) net = getattr(models,'vgg16')(pretrained=True) print(net) |
上記の3行目と4行目は、どちらも学習済みモデルをダウンロードするコードです。
下記のように argparse と組み合わせれば、簡単に任意モデルをダウンロードできます。
1 2 3 4 5 6 7 8 9 |
import argparse from torchvision import models parser = argparse.ArgumentParser() parser.add_argument('-model', default='vgg16') args = parser.parse_args() net = getattr(models, args.model)(pretrained=True) print(net) |
使用例
python train.py -model resnet18
転移学習などに便利そうです。
Batch normalization fusion for PyTorch|GitHub の How to usでも getattr が使われてました。
サンプルコード❹ -Optuna-
Optunaとgetattrは、すごく相性が良いです。以下の記事にもgetattrを使ったコードがあるので、良ければ探してみてください。
まとめ
getattrの使い方をよく理解していなかったので、サンプルコードを考えてみましたが…getattr便利ですね。
本記事には載せてませんが、状態遷移やイベント駆動など、何かをトリガーにして呼び出すメソッドが変わるような処理にもgetattrが活躍しそうです。