🐍Python | Django

[Python] __new__ ? __init__ ?

이줭 2022. 5. 16. 15:21
728x90

파이썬 프로그래머라면 생성자에 관해 들어본 적이 있을 것이고, __init__ 메서드는 생성자 메서드라는 것도 알고 있을 것이다. 하지만, 한 가지 짚고 넘어갈 점은 __init__메서드는 클래스 오브젝트에 메모리를 할당하지 않는다는 것이다. 😮

 

이 말은 __init__ 메서드는 인스턴스를 생성하지 않는다는 말인데... 그러면 __init__을 생성자라고 할 수 있을까..? 😳

 

즉, __init__ 메서드는 객체가 생성되어 초기화되는 즉시 호출되기는 하지만, 메모리는 할당하지 않는 메서드이다.

 

그렇다면, 실제로 메모리를 할당하는 메서드는 무엇일까? 바로 __new__ 메서드이다. 파이썬에서 객체를 생성해보면, __init__이 실행되기 전 항상 __new__가 먼저 실행되며 이때 객체에 메모리가 할당된다.

class Test():
    def __new__(cls, *args, **kwargs):
    	print('__new__')
    	obj = super().__new__(cls)
        return obj
        
    def __init__(self, x=0, y=0):
    	print('__init__')
    	self.x = x
        self.y = y
        
t = Test(1, 2)

'''
__new__
__init__
'''

위의 코드를 보면 __new__ 메서드는 __init__보다 먼저 실행되고, 자신을 파라미터로 받으며 object를 return한다.

 

즉, object를 생성해서 반환한다는 점에서 __new__가 오히려 생성자 메서드에 가까워 보이기도 한다.

 

 

개인적인 생각으로 __new__ 메서드는 객체를 생성하여 반환하기는 하지만, 클래스 인스턴스에 프로퍼티를 부여하는 등 인스턴스 사용을 위한 초기 세팅을 진행하는 __init__이 생성자에 조금 더 적합해 보인다.

 

참고 : https://weeklyit.code.blog/2019/12/24/2019-12%EC%9B%94-3%EC%A3%BC-python%EC%9D%98-__init__%EA%B3%BC-__new__/

728x90