클래스 본문 어디에서든 선언된 코드(__init__ 메서드 외부)와 __init__ 메서드 내부에 선언된 코드는 결코 동일하지 않습니다. 두 실행 시점과 동작 방식이 완전히 다르기 때문입니다.
핵심 차이점
- 클래스 본문의 코드: 클래스가 정의(정확히는 정의가 실행)되는 순간 딱 한 번 실행됩니다.
- __init__ 메서드의 코드: 클래스로부터 인스턴스를 생성할 때마다 매번 실행됩니다.
아래 예제 코드를 통해 이 차이를 직접 확인할 수 있습니다.
예제 코드
import sys
class foo():
print('within class')
def __init__(self):
print('within init')
def do_smthng(self):
print('do something')
def main():
f = foo()
f.do_smthng()
return 0
if __name__ == '__main__':
sys.exit(main())실행 결과
within class within init do something
결과 분석
출력 순서를 보면 그 이유를 명확히 알 수 있습니다.
within class— 클래스foo가 정의되는 시점(모듈이 로드될 때)에 클래스 본문의print문이 즉시 실행됩니다. 아직 인스턴스는 하나도 만들어지지 않았는데도 출력됩니다.within init—f = foo()문으로 인스턴스를 생성하는 순간__init__메서드가 호출되며 실행됩니다.do something—f.do_smthng()을 명시적으로 호출했을 때 실행됩니다.
만약 클래스 본문의 선언이 __init__ 내부의 선언과 동일했다면, within class와 within init은 같은 시점에 같은 횟수만큼 출력되어야 합니다. 하지만 실제로는 클래스 본문의 코드는 정의 시점에 단 한 번 실행되고, __init__의 코드는 인스턴스화될 때마다 반복 실행됩니다. 따라서 두 선언은 실행 시점과 의미 모두에서 서로 다르다는 결론을 내릴 수 있습니다.