最近の気づきですが、 setattr
と getattr
が便利ですね。
2. 組み込み関数 — Python 3.6.1 ドキュメント
どういうものかというと、みなさんもクラスを定義したときにクラスの属性の値を動的に取得したりしたいですよね。
ということでこんな風にやります。
class Foo(): foo = 1 f = Foo() getattr(f, 'foo') # => 1
属性名を文字列にすることで取得ができます*1。
たとえば、こんなふうに使えますね。 Django でモデルを定義したときに、
# models.py from django.db impoort models class Foo(models.Model): foo = models.IntegerFileld(default=0) bar = models.IntegerFileld(default=1) # Foo の `foo` および `bar` をセットしたいとき f = Foo() values = [100, 1000] # foo および bar の値 for col, val in zip([col.name for col in f._meta.local_field][1:], values): setattr(f, col, val) f.foo = 100 f.bar = 1000
などと書けます。 今の場合2つしか属性がないですが、 10個くらいあってもこの for
文は使えるので便利です。
何がいいたいかというと、なんで最近になるまで setattr
と getattr
知らなかったんだろう、ということです。。まだまだ未熟です。。。
*1:むしろ文字列でないといけない。