スターエンジニアになりたい

異世界転生を待って早10年

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 でお会いしましょう.