python __new__ vs __init__
참고자료
생성자
- 생성자는 정적 매서드(static method)이고 첫 번째 매개변수는 cls, 즉 클래스 객체를 받아서 처리
- 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당
__init__
- 파이썬 클래스에서
__init__
매서드는 클래스 오브젝트에 메모리를 할당하지 않음
- 따라서
__init__
은 클래스 인스턴스를 생성하지 않음
- 즉
__init__
은 생성자 메소드로 불리기에 애매함
__init__
매서드는 클래스 인스턴스 형태인 객체가 생성되어 초기화 되는 즉시 호출되지만 객체에 메모리를 할당하지 않는 특수한 메소드임
__new__
- 그렇다면 이썬 객체에 메모리를 할당하는 주인공은 →
__new__
- 파이썬에서 객체를 생성해보면
__init__
이 실행되기 전에 항상 __new__
가 먼저 실행됨. 이떄 객체에 메모리가 할당됨
- 클래스 자신을 숨겨진 파라미터로 받음(cls)
- 반드시 object를 return함. 즉 object를 생성해 반환한다는 점에서
__new__
매서드가 오히려 생성자에 가까워 보일 수 도 있음
그렇다면 파이썬에서의 생성자는 ?
- 다른 언어에서는 메모리에 주소를 할당하는 방식으로 클래스 인스턴스를 생성하는 함수를 생성자라고 부르지 않음
- c++에서는 이를 배분자(Allocator), Java에서는 이를 Static Factory Method라고 부름
- 즉
__new__
메소드는 객체를 생성해 반환하는데 이를 생성자로 부르기에는 적절하지 않음. 차라리 instantiator
이라고 부르는 것이 더 적절
- 클래스 인스턴스에 프로퍼티를 부여하는 등 인스턴스 사용을 위한 초기 세팅을 진행하는
__init__
이 생성자에 조금 더 적합
ㅅㅇㅇㄴㅂㅇㅅ에서 인턴 생활 같이했던 ㅇㄱㅁ이에요 ㅎㅎ 기억하실지 모르겠네요. new 함수 공부중에 우연히 방문했네요. 반가운 마음에 아는척해봅니당