Pythonのメタプログラミング 入門 dynamically create class ! #4
どうも hkrblog です.
最近やたらと寒いですね.....
今日はpythonのメタプログラミング入門と題して本当に触りの部分、
クラスを動的に作って、インスタンス生成して、メソッド呼び出すくらいのものです.
(やっぱりpythonだとコード短いし、パパパッて感じで書けてしまう感じがして
ブログとかに載せやすいからついついpython関連の記事になってしまう....w)
実際このコードは2, 3か月前に書いたものです...
まずはコードを載せてしまいます.
class Student: def __init__(self, student_id, name): self.student_id = student_id self.name = name def say_my_name(self): return "Hi I'm " + self.name def student_init(self, student_id, name): self.student_id = student_id self.name = name def say_my_name(self): return "Hi I'm " + self.name def main(): student_class = type('Student2', (), {'__init__': student_init, 'say_my_name': say_my_name}) student_a = Student(1, 'Alice') student_b = student_class(2, 'Mike') print(type(student_a), student_a.say_my_name()) print(type(student_b), student_b.say_my_name()) if __name__ == '__main__': main()
type関数でクラスを作成します
main()のprint文print(type(student_a), student_a.say_my_name())
でも使ってますが、普段良く使うあのtype関数です
type(classname, superclasses, attribute dict)
こんな感じです.
つまり動的に作成したクラス名がStudent2です.(我ながらセンス0ですねw)
今回関数を定義してますが、ラムダが使えます.
'say_my_name': lambda self ~~~と書いてあげれば大丈夫です.
比較対象として、Studentクラスも作成してます.
実行結果は以下です.
<class '__main__.Student'> Hi I'm Alice <class '__main__.Student2'> Hi I'm Mike
動的にStudent2クラスを作成して実行できました.
ではみなさん #5 でお会いしましょう.