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 중국어 웹사이트의 기타 관련 기사를 참조하세요!