코드를 사용하여 Python에서 클래스 인스턴스를 동적으로 생성하는 방법에 대한 자세한 설명

高洛峰
풀어 주다: 2017-03-26 10:07:53
원래의
1721명이 탐색했습니다.

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿