Python
__new__와 __init__의 차이
두잇 두두
2025. 3. 5. 22:41
728x90
둘 다 Python에서 객체를 생성할 때 호출되는 특별한 메서드입니다.
__new__
new는 새로운 객체를 생성하는 메서드
클래스의 인스턴스가 생성되기 전 호출, 새로운 객체를 반환
보통 immutable 객체에서 객체 생성 방식을 제어할 때 사용 됩니다.
class MyClass:
def __new__(cls, *args, **kwargs):
print('New 객체 생성')
instance = super().__new__(cls)
return instance
def __init__(self, value):
print('Init 호출')
self.value = value
ojb = MyClass(1)
# New 객체 생성
# Init 호출
__new__는 객체가 메모리에 할당되는 시점에 호출됩니다. 그 후, __init__에서 초기화가 이루어집니다
__new__를 사용하는 이유
- 불변 객체: 불변 객체(예: int, str, tuple)는 새로운 객체를 생성할 때 __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):
self.value = value
obj1 = Singleton(10)
obj2 = Singleton(20)
print(obj1 is obj2) # True (같은 객체)
위와 같은 패턴으로 할 시 value는 덮어씌어짐
obj1 = Singleton(10) # 새로운 객체 생성, value는 10
obj2 = Singleton(20) # 이미 존재하는 객체 반환, value는 20으로 덮어씌워짐
print(obj1 is obj2) # True (같은 객체)
print(obj1.value) # 20
print(obj2.value) # 20