[Python] __init__(), __new__()
이전에 파이썬의 클래스에 대해 포스팅을 했었는데, 그 때 초기화를 위한 함수인 __init__에 대해 설명했었다.
클래스를 호출 할때 어떤 함수나 값을 호출하고 싶을 때 정의한다.
어떤 클래스의 객체가 만들어질 때, 자동으로 호출되어 그 객체가 갖게 될 성질들을 정해준다.
여러가지 클래스의 코드를 찾아보고 있던 도중, __new__라는 메서드를 봤는데,
__init__과 사용법이 비슷해보여 __new__의 용도와 __init__과의 차이점에 대해 알아보고자 한다.
__new__() vs __init()__
두 메서드는 클래스를 이용해 객체를 만들 때 사용된다.
간단하게 설명하자면 다음과 같다.
1. __new__()
: 새로운 객체를 생성하는 역할을 한다.
마치 공장에서 자동차의 부품을 모아 새로운 자동차를 만드는 과정과 같다.
2. __init__()
: 생성된 객체를 초기화 하는 역할을 한다.
만들어진 자동차에 기름을 넣고, 타이어를 점검하는 등 초기 설정을 하는 과정과 같다.
즉 __new__() 메서드를 호출하면 기본적인 인스턴스를 생성하고,
이 과정에서 새로운 메모리 공간이 할당되어 새로운 객체가 만들어진다.
객체 생성 과정
__new__와 __init__에 대해 알았으므로, 객체를 생성할 때 일어나는 과정을 단계별로 설명할 수 있게된다.
1. 클래스 호출
: 객체를 생성하기 위해 클래스를 호출하면 __new__() 메서드를 호출한다.
2. 객체 생성
: __new__() 메서드는 새로운 객체를 생성하고, 이 객체를 반환한다.
반환된 객체는 아직 초기화되지 않은 상태다.
3. 객체 초기화
: 생성된 객체가 반환되면, __init__() 메서드가 호출되어 이 객체를 초기화한다.
여기서 객체의 초기 속성등을 설정한다.
다음과 같이 예제를 들어 확인해보자.
new는 인자를 cls라고 선언하며, init은 self라고 선언한다.
class MyClass:
def __new__(cls, *args, **kwargs):
# 새로운 인스턴스를 생성한다.
instance = super().__new__(cls)
print(f"__new__()에서 생성된 인스턴스: {instance}")
return instance
def __init__(self, value):
# 생성된 인스턴스를 초기화
print(f"__init__()에서 초기화 중: {self}")
self.value = value
# 객체 생성
obj = MyClass(10)
###출력 결과###
__new__()에서 생성된 인스턴스: <__main__.MyClass object at 0x000001F85C06BF10>
__init__()에서 초기화 중: <__main__.MyClass object at 0x000001F85C06BF10>
사실 대부분의 인스턴스 초기화는 __init__으로 해결되기 때문에, 따로 __new__를 사용 할 일이 별로 없긴 하지만, __new__를 사용하면 인스턴스를 생성 여부 등을 제어 할 수 있다.
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, value):
if not hasattr(self, '_initialized'):
self.value = value
self._initialized = True
# 객체 생성
singleton1 = Singleton(10)
print(singleton1.value) # 10
singleton2 = Singleton(20)
print(singleton2.value) # 10
# 두 객체는 동일한 인스턴스이다.
print(singleton1 is singleton2) # True
해당 코드의 동작을 설명해보자면 다음과 같다.
1. 클래스에서 하나의 인스턴스를 생성하고 이를 반환한다. (__new__)
cls._instanc가 None인 경우에만 새로운 인스턴스를 생성하고, 이미 존재하면 기존 인스턴스를 반환한다.
2. 이미 초기화된 인스턴스인지 확인한다.
인스턴스가 초기화되지 않은 경우에만 value를 설정한다.
따라서, singleton1 객체가 처음 생성될 때, __new__()와 __init__()이 호출되어 value가 10으로 설정된다.
singleton2 객체를 생성할 땐, 이미 singleton2 객체가 존재하므로 같은 인스턴스가 반환된다.
따라서 singleton1과 singleton2는 동일한 인스턴스임을 확인할 수 있다.
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] 파일 날짜 가져오기 (0) | 2024.08.08 |
---|---|
[Python] multiprocessing (0) | 2024.08.01 |
[Python] 주피터 노트북 서버 설정하기 (0) | 2024.07.11 |
[Python] 리눅스에 Pyenv 가상환경 설치 (0) | 2024.07.08 |
[Python] Beautiful Soup(bs4) (0) | 2024.06.25 |