파이썬을 다루면서 클래스를 작성해보았다면 인스턴스를 생성해본 적이 있을 것이다.
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 |
댓글