IT Share you

Python의 클래스 개체에서 새 인스턴스를 만드는 방법

shareyou 2020. 12. 7. 21:10
반응형

Python의 클래스 개체에서 새 인스턴스를 만드는 방법


Python에서 클래스의 인스턴스를 동적으로 만들어야합니다. 기본적으로 load_module 및 inspect 모듈을 사용하여 클래스를 클래스 개체로 가져오고로드하지만이 클래스 개체의 인스턴스를 만드는 방법을 알 수 없습니다.

도와주세요!


나는이 페이지로 나를 가져온 질문에 대한 답을 알아 냈다. 실제로 아무도 내 질문에 대한 답변을 제안하지 않았기 때문에 게시 할 것이라고 생각했습니다.

class k:
  pass

a = k()
k2 = a.__class__
a2 = k2()

이 시점에서 a와 a2는 모두 동일한 클래스 (클래스 k)의 인스턴스입니다.


다음과 같이 세 개의 매개 변수를 사용하여 내장 된 "유형"을 호출하면됩니다.

ClassName = type("ClassName", (Base1, Base2,...), classdictionary)

아래 의견에 명시된 업데이트 는이 질문에 대한 답이 아닙니다. 일부 사람들이 클래스를 동적으로 생성하려고 시도하는 힌트가 있기 때문에 삭제되지 않은 상태로 유지합니다. 이것이 위의 줄이하는 일입니다.

클래스의 객체를 만들려면 허용 된 답변에 넣은 참조도 있으므로 클래스를 호출하면됩니다.

instance = ClassObject()

따라서 인스턴스화 메커니즘은 다음과 같습니다.

Python은 new일부 언어에서 사용하는 키워드를 사용하지 않습니다. 대신 데이터 모델이 다른 호출 가능 항목과 동일한 구문으로 호출 될 때 클래스의 인스턴스를 생성하는 데 사용되는 메커니즘을 설명합니다.

해당 클래스의 __call__메소드가 호출됩니다 (클래스의 경우 해당 클래스는 일반적으로 내장 된 "metaclass"입니다 type). 이 호출의 정상적인 동작은 __new__인스턴스화되는 클래스 에서 (의사) 정적 메서드 를 호출 한 다음 __init__. __new__방법은 메모리 및 할당에 대한 책임이며, 일반적으로 수행 __new__object어떤 클래스 계층 구조의 루트입니다.

따라서 호출을 ClassObject()호출하면 ClassObject.__class__.call()(일반적으로 type.__call__)이 __call__메서드는 ClassObject 자체를 첫 번째 매개 변수로 수신합니다. Pure Python 구현은 다음과 같습니다. (cPython 버전은 물론 C로 수행되며 코너 케이스에 대한 많은 추가 코드가 있습니다. 최적화)

class type:
    ...
    def __call__(cls, *args, **kw):
          constructor = getattr(cls, "__new__")
          instance = constructor(cls) if constructor is object.__new__ else constructor(cls, *args, **kw)
          instance.__init__(cls, *args, **kw)
          return instance

(필자는 문서에보고 기억하지 않습니다 루트에 추가 매개 변수를 억제하는 정확한 정당화 (또는 장치) __new__및 다른 클래스에 전달 -하지만 "실제 생활에서"일 것입니다 - 경우 object.__new__여분의 매개 변수와 함께 호출이 유형 오류가 발생하지만의 사용자 정의 구현은 __new__일반적으로 추가 매개 변수를 얻습니다)


이것이 이미 존재 Child한다고 가정하고 코드에 명명 클래스를 동적으로 생성하는 방법입니다 Parent... 명시 적 Parent클래스 가 없더라도 사용할 수 있습니다 object.

아래 코드는 정의한 __init__()다음 클래스와 연결합니다.

>>> child_name = "Child"
>>> child_parents = (Parent,)
>>> child body = """
def __init__(self, arg1):
    # Initialization for the Child class
    self.foo = do_something(arg1)
"""
>>> child_dict = {}
>>> exec(child_body, globals(), child_dict)
>>> childobj = type(child_name, child_parents, child_dict)
>>> childobj.__name__
'Child'
>>> childobj.__bases__
(<type 'object'>,)
>>> # Instantiating the new Child object...
>>> childinst = childobj()
>>> childinst
<__main__.Child object at 0x1c91710>
>>>

가져올 클래스가있는 모듈이있는 경우 다음과 같이 할 수 있습니다.

module = __import__(filename)
instance = module.MyClass()

If you do not know what the class is named, you can iterate through the classes available from a module.

import inspect
module = __import__(filename)
for c in module.__dict__.values():
    if inspect.isclass(c):
        # You may need do some additional checking to ensure 
        # it's the class you want
        instance = c()

참고URL : https://stackoverflow.com/questions/5924879/how-to-create-a-new-instance-from-a-class-object-in-python

반응형