내가 묻는 질문은 파이썬에서 __new__ 및 __init__을 사용 하는 것과 중복되는 것 같습니다 . 그러나 그럼에도 불구 __new__
하고와 의 실제 차이점이 정확히 무엇인지는 여전히 명확하지 않습니다 __init__
.
__new__
객체 생성과 __init__
객체 초기화를 위해 서두르 기 전에 분명히하자 . 사실, 우리가 배치를 새로 배치 한 C ++에서 경험을 가지고 있기 때문에 객체 구별과 초기화를 구분하기 때문에 그 구별은 나에게 자연 스럽습니다 .
파이썬 C의 API 튜토리얼은 이런 식으로 설명 :
새 멤버는 유형의 객체를 초기화하는 것이 아니라 생성하는 역할을합니다. 그것은
__new__()
방법 으로 파이썬에서 노출됩니다 . ... 새로운 메소드를 구현하는 한 가지 이유는 인스턴스 변수의 초기 값을 보장하는 것 입니다.
그래서, 그렇습니다-나는 무엇을 얻지__new__
만, 그럼에도 불구하고 여전히 파이썬에서 그것이 왜 유용한 지 이해하지 못합니다. 주어진 예는 __new__
"인스턴스 변수의 초기 값을 보장"하려는 경우 유용 할 수 있다고 말합니다 . 글쎄, 그게 정확히 무엇 __init__
입니까?
C API 학습서에서는 새 유형 ( "Noddy")이 작성되고 유형의 __new__
기능이 정의 된 예제가 표시 됩니다. Noddy 타입은이라는 문자열 멤버를 포함하고 first
있으며,이 문자열 멤버는 다음과 같이 빈 문자열로 초기화됩니다 :
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
__new__
여기에 정의 된 메소드 가 없으면 PyType_GenericNew
모든 인스턴스 변수 멤버를 NULL로 초기화하는 을 사용해야 합니다. 따라서이 __new__
메소드 의 유일한 이점은 인스턴스 변수가 NULL이 아닌 빈 문자열로 시작한다는 것입니다. 그러나 인스턴스 변수가 기본값으로 초기화되도록 신경 쓰면 __init__
메소드 에서 그렇게 할 수 있었기 때문에 이것이 왜 유용한가 ?
__new__
상용 구판은 절대 변하지 않기 때문에 "보일러 판"이라고하는 코드 는 상용구가 아닙니다. 때로는 특정 코드를 다른 것으로 바꿔야합니다.