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()
'IT Share you' 카테고리의 다른 글
Python 스크립트를 실행할 때 vcvarsall.bat를 찾을 수 없습니다. (0) | 2020.12.07 |
---|---|
C ++ 순수 가상 함수에는 본문이 있습니다. (0) | 2020.12.07 |
트위터 부트 스트랩을 만드는 방법 (0) | 2020.12.07 |
facet_wrap 레이블을 완전히 제거하십시오. (0) | 2020.12.07 |
인증 된 CORS 요청의 프리 플라이트 OPTIONS 요청이 Chrome에서는 작동하지만 Firefox에서는 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.07 |