Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでクラスを動的にロードする方法をわかりやすく解説

Pythonの標準機能には、「datetime.datetime」のような完全修飾クラス名の文字列を受け取って、対応するクラスオブジェクトを返す組み込み関数は用意されていません。しかし、__import__getattrを組み合わせることで、そのような機能を持つ関数を簡単に自作することができます。

実装例

以下のコードは、ドット区切りの文字列を解析してモジュールを読み込み、クラスを解決して返す関数の例です。

def get_class(s):
    parts = s.split('.')
    module = ".".join(parts[:-1])
    m = __import__(module)
    for comp in parts[1:]:
        m = getattr(m, comp)
    return m

この関数では、まず文字列をドットで分割し、最後の要素以外をつなげてモジュール名として__import__で読み込みます。その後、残りの各要素に対してgetattrを順番に適用することで、目的のクラスオブジェクトにたどり着きます。

使用例

実際にこの関数を使って、文字列で指定したクラスを動的に取得し、そのメソッドを呼び出してみましょう。

import datetime

def get_class(cls):
    parts = cls.split('.')
    module = ".".join(parts[:-1])
    m = __import__(module)
    for comp in parts[1:]:
        m = getattr(m, comp)
    return m

print(get_class('datetime.datetime').now())

出力結果

このコードを実行すると、以下のように現在の日時が出力されます。

2018-01-23 14:04:09.843000

補足:Python 3ではimportlibが便利

Python 3以降では、標準ライブラリのimportlibモジュールを使うことで、より安全かつ簡潔に同じ処理を実現できます。新しいコードではこちらの方法が推奨されます。

import importlib

def get_class(s):
    parts = s.split('.')
    module = ".".join(parts[:-1])
    mod = importlib.import_module(module)
    return getattr(mod, parts[-1])

print(get_class('datetime.datetime').now())

プラグイン機構や設定ファイルからクラス名を指定してインスタンス化したい場合など、クラスを動的にロードしたい場面は意外と多くあります。ぜひこれらのテクニックを活用してください。

  1. 【サンプルコード付き】JavaScriptファイルを動的に読み込む方法を解説

    JavaScriptファイルを動的に読み込むことで、ページの初期表示を高速化したり、必要なタイミングで必要なスクリプトだけを取得したりできます。ここでは、ボタンをクリックしたときに外部のJavaScriptファイルを読み込むサンプルコードを紹介します。サンプルコード<!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1.0 /> <tit

  2. PythonでEnvironmentError例外を捕捉する方法をわかりやすく解説

    EnvironmentErrorとは何か EnvironmentErrorは、Pythonの外部から発生するエラー(オペレーティングシステムやファイルシステムなどに起因するもの)のための基底クラスです。StandardErrorクラスのサブクラスであり、同時にIOErrorおよびOSErrorという例外の基底クラスでもあります。 重要なポイントとして、EnvironmentError自体は直接発生(raise)されることはありません。実際にプログラム上で捕捉するのは、そのサブクラスであるIOErrorやOSErrorになります。 EnvironmentErrorの継承関係 Environme