코드를 사용하여 Python에서 클래스 인스턴스를 동적으로 생성하는 방법에 대한 자세한 설명
Java에서는 리플렉션을 통해 클래스 이름을 기반으로 클래스 인스턴스를 생성할 수 있는데 Python에서는 어떻게 비슷한 기능을 구현할 수 있을까요? 실제로 Python에는 내장 함수 가져오기가 있습니다. 이 함수를 사용하면 런타임에 일부 모듈을 동적으로 로드할 수 있습니다.
소개
Java 리플렉션을 통해 클래스 이름을 기반으로 클래스 인스턴스를 생성할 수 있는데 Python에서 유사한 기능을 어떻게 달성할 수 있을까요?
실제로 Python에는 내장 함수 import가 있습니다. 이 함수를 사용하면 런타임에 일부 모듈을 동적으로 로드할 수 있습니다. 다음과 같습니다:
def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_name]) class_meta = getattr(module_meta, class_name) obj = class_meta(*args, **kwargs) return obj
예
먼저 세 개의 파일이 포함된 my_modules 디렉터리를 만듭니다.
* init.py: 모듈 파일
* my_module.py: 테스트용 모듈
* my_another_module: 테스트용 또 다른 모듈
my_module.py
from my_modules.my_another_module import * class MyObject(object): def test(self): print 'MyObject.test' MyObject1().test() MyObject2().test() MyAnotherObject().test() class MyObject1(object): def test(self): print 'MyObject1.test' class MyObject2(object): def test(self): print 'MyObject2.test'
my_another_module.py
class MyAnotherObject(object): def test(self): print 'MyAnotherObject.test'
test.py
def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_name]) class_meta = getattr(module_meta, class_name) obj = class_meta(*args, **kwargs) return obj obj = createInstance("my_modules.my_module", "MyObject") obj.test() MyObject.test MyObject1.test MyObject2.test MyAnotherObject.test
pyinstaller 통합
pyinstaller로 패키지된 애플리케이션의 경우 위의 코드를 사용하면 패키지된 프로그램 실행 시 다음과 같은 오류가 발생합니다
Traceback (most recent call last): File "test.py", line 12, in <module> obj = createInstance("my_modules.my_module", "MyObject") File "test.py", line 7, in createInstance module_meta = __import__(module_name, globals(), locals(), [class_name]) ImportError: No module named my_modules.my_module Failed to execute script test
여기서 오류가 발생한 이유는 pyinstaller가 분석 클래스를 패키징할 때 my_modules 아래의 모듈을 분석하지 않아서 실행 시 오류가 보고되었기 때문입니다.
해결책 1:
test.py의 my_modules 아래에 있는 모듈을 수동으로 가져옵니다. 아래 코드의 첫 번째 줄을 참조하세요. 이 방법은 가장 간단하지만 분명히 좋지는 않습니다.
import my_modules.my_module def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_name]) class_meta = getattr(module_meta, class_name) obj = class_meta(*args, **kwargs) return obj obj = createInstance("my_modules.my_module", "MyObject") obj.test()
해결책 2:
pyinstaller를 사용하여 패키지할 때 "--hidden- import를 지정하세요. ", 다음과 같이
pyinstaller -D --hidden-import my_modules.my_module test.py
해결 방법 3:
Python 런타임 경로의 동적 수정, In 참조 아래 코드의 처음 두 줄에서는 환경 변수나 매개변수를 통해 경로를 전달할 수 있습니다. 분명히 이 방법은 처음 두 가지 방법보다 훨씬 더 유연합니다.
위 내용은 코드를 사용하여 Python에서 클래스 인스턴스를 동적으로 생성하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

Linux 터미널에서 Python 사용 ...

Investing.com의 크롤링 전략 이해 많은 사람들이 종종 Investing.com (https://cn.investing.com/news/latest-news)에서 뉴스 데이터를 크롤링하려고합니다.
