Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 문자열로 클래스를 동적으로 로드하는 방법

개요

파이썬에는 'datetime.datetime'처럼 점(.)으로 구분된 완전한 클래스 이름(fully qualified class name)을 문자열로 받아 해당 클래스 객체를 그대로 반환해 주는 내장 함수가 없습니다. 하지만 __import__getattr을 조합하면 이러한 기능을 손쉽게 직접 구현할 수 있습니다.

예제 코드

다음은 문자열 형태의 클래스 경로를 받아 실제 클래스 객체를 반환하는 함수입니다.

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

동작 원리

  • 클래스 이름 문자열을 점(.)을 기준으로 분리합니다.
  • 마지막 요소를 제외한 나머지 부분으로 모듈 경로를 만든 뒤 __import__로 해당 모듈을 불러옵니다.
  • 남은 요소들을 getattr로 순차적으로 탐색하여 최종적으로 클래스 객체에 도달합니다.

실제 사용 예시

아래는 위 함수를 활용해 'datetime.datetime' 클래스를 동적으로 가져와 현재 시간을 출력하는 예입니다.

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

참고: 파이썬 3에서는 importlib 사용 권장

파이썬 3 환경에서는 내장 함수 __import__를 직접 호출하기보다 표준 라이브러리의 importlib 모듈을 사용하는 것이 공식적으로 권장됩니다. 가독성과 안정성 면에서 더 유리하기 때문입니다.

import importlib

module = importlib.import_module('datetime')
cls = getattr(module, 'datetime')
print(cls.now())

이처럼 설정 파일이나 플러그인 시스템에서 클래스 이름을 문자열로 관리해야 하는 경우, 위 방법들을 활용하면 런타임에 유연하게 클래스를 동적으로 로드할 수 있습니다.