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__이 생성자에 조금 더 적합해 보인다.
728x90
'🐍Python | Django' 카테고리의 다른 글
[Python] Type Check - type(), isinstance() (0) | 2022.05.18 |
---|---|
[Python] lstrip(), rstrip(), strip() (0) | 2022.05.17 |
[Django] ORM Eager Loading(select related & prefetch_related) (0) | 2022.05.15 |
[Django] QuerySet method (0) | 2022.05.12 |
[Django] QuerySet?! (0) | 2022.05.12 |