본문 바로가기
[Language] - Python

# 17. [Magic Method] __new__() & __init__()

by Bebsae 2021. 8. 2.

파이썬을 다루면서 클래스를 작성해보았다면 인스턴스를 생성해본 적이 있을 것이다. 

 

class o:
    pass
    
o1 = o()

대체로 <"클래스명()' 연산을 통해 해당 클래스 타입의 인스턴스가 메모리에 할당된다..>는 사실은 알고 있을 것이다. 사실은 이 과정을 좀더 자세하게 보면

 

1. 인스턴스를 특정 메모리 공간에 할당한다.

2. 할당된 인스턴스를 초기화 한다.

 

위의 2 단계를 거치는 것이 "클래스명()" 연산의 역할이다. 

 

class o:
    def __new__(cls, *args, **kwargs):
        print('new')
        return super().__new__(cls)

    def __init__(self):
        print('init')

o1 = o()

>>
new
init

모든 클래스의 최상위 부모 클래스는 object 클래스이다. object 클래스의 매직 메소드중 (__new__, __init__)을 오버라이딩 한 코드이다. __new__ 메소드는 classmethod 이기 때문에 cls 키워드를 사용한다. 위 코드를 보면 알다시피 o 클래스 타입의 인스턴스를 생성하자 new와 init이 출력된 것을 확인할 수 있다. 

 

class o:
    def __new__(cls, *args, **kwargs):
        print('new')
        return super().__new__(cls)

    def __init__(self, num=10):
        self.num = num

o2 = o.__new__(o)
>>
new

o2.num
>>
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'o' object has no attribute 'num'

위 코드는 __new__ 메소드를 통해 인스턴스를 할당만 할뿐, 초기화하지 않은 것이다. o2의 num을 참조하려면 __init__ 메소드까지 호출해주어야 한다.

'[Language] - Python' 카테고리의 다른 글

# 19. [Magic Method] __call__()  (0) 2021.11.19
# 18. 데코레이터 (Decorator)  (0) 2021.11.09
# 16. eval  (0) 2021.08.02
# 15. [Tip] chunk  (0) 2021.06.02
# 14. dictionary setdefault, defaultdict  (0) 2021.05.28

댓글