python __new__ vs __init__

0

참고자료

생성자

  • 생성자는 정적 매서드(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__이 생성자에 조금 더 적합

1개의 댓글

comment-user-thumbnail
2022년 12월 14일

ㅅㅇㅇㄴㅂㅇㅅ에서 인턴 생활 같이했던 ㅇㄱㅁ이에요 ㅎㅎ 기억하실지 모르겠네요. new 함수 공부중에 우연히 방문했네요. 반가운 마음에 아는척해봅니당

답글 달기