Pythonで文字列から定義済みクラスのインスタンスを作る

More than 1 year has passed since last update.

やってみたメモ。


前提


  • Python3.5.2 を利用

  • ファイルは以下の通り

.

├── main.py
└── classes.py


classes.py

class Hoge(object):

def __init__(self):
self.name = 'hoge'

def get_name(self):
print(self.name)

class Fuga(object):

def __init__(self):
self.name = 'fuga'

def get_name(self):
print(self.name)



globalsを使うパターン


main.py

# ここは別に`from classes import *`でも可

from classes import Hoge
from classes import Fuga

cls = globals()['Hoge']
instance = cls()
instance.get_name() #=> 'hoge'

cls = globals()['Fuga']
instance = cls()
instance.get_name() #=> 'fuga'



getattrを使うパターン

classes.pyはそのまま使うものとして。


main.py

import classes

cls = getattr(classes, 'Hoge')
instance = cls()
instance.get_name() #=> 'hoge'

cls = getattr(classes, 'Fuga')
instance = cls()
instance.get_name() #=> 'fuga'


getattrの対象となるモジュール(今回でいうところのclasses)に、文字列で動的に指定するクラスが含まれていないといけない。

実際、1クラス1ファイルで分割して書くことが多いと思いますので、あまり実用的じゃなさそうですね。あくまで1つの方法として。

他にも方法はあると思いますが、実用的なのはglobalsを使うパターンでしょうか。

※ 備考(2016/09/04)

元々タイトルを「Pythonで動的にインスタンスを生成する」にしていましたが、@mtwtk_man sanにご指摘を受けて変更しました。