◽ Python

[Python] __init__ 와 __init__.py 의미는 무엇일까?


들어가며... 

  자바 개발자 입장에서 가장 이해가 안되는 대목 중 하나인데, 폴더를 만들고 그 안에 __init__.py를 만들어져 있는 모습을 봤는데, 너무 생소했다. 매직 메소드(magic method) 중 하나인 __init__과도 헷갈린다. 이 헷갈림을 정리하려고 이 글에 간단히 정리했다.


1. __init__ 뭘까?

  "__init__"을 메서드라고 칭하고 이는 클래스(Class)에서 사용되는 특별한 메서드라고 하며, 클래스의 인스턴스가 생성될 때 자동으로 호출되는 구조라고 한다. 즉, 클래스가 인스턴스화될 때 호출되는 생성자(constructor) 메서드라고 볼 수 있다. 자바에 비유하자면, 클래스의 "Constructor"라고 생각하면 이해가 바로 된다.

 

  아래의 코드를 보면, Rectangle 클래스의 인스턴스를 생성한 후, width와 height 인스턴스 변수를 출력하고, area 메서드를 호출하여 면적을 출력하고, 이를 통해 __init__ 메서드가 인스턴스 변수를 초기화하는 데 사용함을 볼 수 있는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
 
# 인스턴스 생성
rect = Rectangle(510)
 
# 너비와 높이 출력
print(f"Width: {rect.width}")
print(f"Height: {rect.height}")
 
# 면적 출력
print(f"Area: {rect.area()}")
cs

 

아래는 결과

1
2
3
Width: 5
Height: 10
Area: 50
cs

 

 

2. 그럼 __init__.py 뭘까?

  파이썬에서 패키지는 하나 이상의 모듈을 가진 디렉토리라고 볼 수 있는데, 이 패키지를 이용하면 모듈을 더욱 체계적으로 관리하고, 이름 충돌을 방지하며, 코드 재사용성을 높일 수 있다고 한다. 이때, 패키지의 초기화 작업을 수행하는 데 사용되는 파일이 __init__.py라고 정의되어 있다. 다시 말하면 __init__.py 파일은 해당 패키지를 파이썬 인터프리터에게 패키지로 인식시키는 데 사용되는 수단이라고 볼 수 있다.

 

  역시나 가장 이해하기 쉬운건 코드를 봐야한다.  아래의 코드를 보면, 패키지에 포함된 module1과 module2 모듈을 로드하고, 해당 모듈에서 정의된 모든 클래스와 함수를 패키지의 네임스페이스에 포함하는데, 이렇게 하면 다른 모듈에서 mypackage 패키지에 포함된 모듈의 함수나 클래스를 직접 참조할 수 있게 된다.

1
2
3
4
5
6
7
8
9
mypackage/
    __init__.py
    module1.py
    module2.py
 
# mypackage/__init__.py
 
from .module1 import *
from .module2 import *
cs

  결국엔 이 __init__.py를 사용하는 이유는 패키지 구조를 효율적으로 사용하기 위함이다.

 

 

추가적으로 설명을 더 하자면, "네임 스페이스"라는 용어인데 위 예시 코드를 볼 때. 다른 python file에서 import 할 때, 개별적으로 module1.py, module2.py import하는 것이 아니라 mypackage..module1으로 가져올 수 있으니 파일명이 겹쳐도 구분할 수 있다는 개념에서 나온 것 같은데... 뭐.. 그렇다고 한다.

 

 

 


참고 : 

- https://chancoding.tistory.com/207


 

푸터바