복붙노트

[PYTHON] 파이썬 클래스를 동적으로로드하는 방법

PYTHON

파이썬 클래스를 동적으로로드하는 방법

주어진 파이썬 클래스의 문자열. my_package.my_module.MyClass,로드하는 가장 좋은 방법은 무엇입니까?

즉, 파이썬에서 Java와 동등한 Class.forName () 함수를 찾고 있습니다. Google App Engine에서 작동해야합니다.

바람직하게는 클래스의 FQN을 문자열로 받아들이고 클래스에 대한 참조를 반환하는 함수입니다.

my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()

해결법

  1. ==============================

    1.파이썬 문서에서, 당신이 원하는 기능은 다음과 같습니다.

    파이썬 문서에서, 당신이 원하는 기능은 다음과 같습니다.

    def my_import(name):
        components = name.split('.')
        mod = __import__(components[0])
        for comp in components[1:]:
            mod = getattr(mod, comp)
        return mod
    

    간단한 __import__가 작동하지 않는 이유는 패키지 문자열의 첫 번째 점을 지나간 어떤 것도 가져 오기가 가져올 모듈의 속성이기 때문입니다. 따라서 다음과 같은 것은 작동하지 않습니다.

    __import__('foo.bar.baz.qux')
    

    위의 함수를 다음과 같이 호출해야합니다.

    my_import('foo.bar.baz.qux')
    

    또는 귀하의 예를 들면 :

    klass = my_import('my_package.my_module.my_class')
    some_object = klass()
    

    편집 : 나는 이것에 조금 벗어났다. 기본적으로 원하는 것은 다음과 같습니다.

    from my_package.my_module import my_class
    

    위의 함수는 빈 fromlist가있는 경우에만 필요합니다. 따라서 적절한 호출은 다음과 같습니다.

    mod = __import__('my_package.my_module', fromlist=['my_class'])
    klass = getattr(mod, 'my_class')
    
  2. ==============================

    2.자신 만의 롤을 만들고 싶지 않다면 pydoc 모듈에서 사용할 수있는 기능이 있습니다.

    자신 만의 롤을 만들고 싶지 않다면 pydoc 모듈에서 사용할 수있는 기능이 있습니다.

    from pydoc import locate
    my_class = locate('my_package.my_module.MyClass')
    

    여기에 나열된 다른 것들에 비해이 접근법의 장점은 locate가 모듈 안에 직접있는 객체가 아니라 제공된 점선 경로에서 파이썬 객체를 찾을 수 있다는 것입니다. 예 : my_package.my_module.MyClass.attr.

    자신의 요리법이 무엇인지 궁금하다면, 여기에 함수가 있습니다 :

    def locate(path, forceload=0):
        """Locate an object by name or dotted path, importing as necessary."""
        parts = [part for part in split(path, '.') if part]
        module, n = None, 0
        while n < len(parts):
            nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
            if nextmodule: module, n = nextmodule, n + 1
            else: break
        if module:
            object = module
        else:
            object = __builtin__
        for part in parts[n:]:
            try:
                object = getattr(object, part)
            except AttributeError:
                return None
        return object
    

    그것은 pydoc.safeimport 함수에 의존한다. 여기에 대한 문서가 있습니다 :

    """Import a module; handle errors; return None if the module isn't found.
    
    If the module *is* found but an exception occurs, it's wrapped in an
    ErrorDuringImport exception and reraised.  Unlike __import__, if a
    package path is specified, the module at the end of the path is returned,
    not the package at the beginning.  If the optional 'forceload' argument
    is 1, we reload the module from disk (unless it's a dynamic extension)."""
    
  3. ==============================

    3.

    import importlib
    
    module = importlib.import_module('my_package.my_module')
    my_class = getattr(module, 'MyClass')
    my_instance = my_class()
    
  4. ==============================

    4.

    def import_class(cl):
        d = cl.rfind(".")
        classname = cl[d+1:len(cl)]
        m = __import__(cl[0:d], globals(), locals(), [classname])
        return getattr(m, classname)
    
  5. ==============================

    5.OK, 그것이 저에게 효과적이었습니다 (저는 Python 2.7을 사용하고 있습니다) :

    OK, 그것이 저에게 효과적이었습니다 (저는 Python 2.7을 사용하고 있습니다) :

    a = __import__('file_to_import', globals(), locals(), ['*'], -1)
    b = a.MyClass()
    

    그런 다음 b는 'MyClass'클래스의 인스턴스입니다.

  6. ==============================

    6.Google App Engine에는 import_string이라는 webapp2 기능이 있습니다. 자세한 내용은 https : //webapp-improved.appspot.com/api/webapp2.html을 참조하십시오.

    Google App Engine에는 import_string이라는 webapp2 기능이 있습니다. 자세한 내용은 https : //webapp-improved.appspot.com/api/webapp2.html을 참조하십시오.

    그래서,

    import webapp2
    my_class = webapp2.import_string('my_package.my_module.MyClass')
    

    예를 들어 이것은 핸들러 나 문자열을 사용할 수있는 webapp2.Route에서 사용됩니다.

  7. ==============================

    7.

    module = __import__("my_package/my_module")
    the_class = getattr(module, "MyClass")
    obj = the_class()
    
  8. from https://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class by cc-by-sa and MIT license