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