초보자든 숙련자든 능숙한 Python 프로그래머라면 코드를 프로젝트의 다른 부분에서 쉽게 재사용할 수 있는 모듈 단위로 분해할 수 있어야 합니다. 이 문서에서는 프로젝트 계층 구조의 범위 내에서 이러한 모듈을 개발, 임포트 및 활용하는 방법에 대한 지침을 제공합니다.
코드 모듈화란 무엇이며 왜 사용해야 하나요?
모듈화는 관심사를 쉽게 분리하고 코드 재사용을 촉진하는 프로그래밍의 기본 원칙입니다. 객체 지향적 특성으로 인해 Python은 모듈화를 쉽게 구현할 수 있는 언어 중 하나입니다. 모듈화는 개별 함수나 메서드에 특정 책임을 할당하여 프로그램 실행 중에 각 함수가 다른 함수와 함께 작업을 수행하여 종합적인 애플리케이션을 생성하는 것으로 간주할 수 있습니다.
코드를 모듈화하면 전용 메서드 내에서 단일 명령 템플릿을 생성할 수 있으므로 “반복하지 않기”(DNRY) 원칙을 준수하는 데 도움이 될 수 있습니다. 그런 다음 이 접근 방식을 관련 스크립트 전체에 일관되게 적용할 수 있으므로 전체 코드베이스에서 유사한 코드 조각을 복제할 필요가 없습니다.
모듈화는 코드 본문에 페르소나 역할을 하는 식별자를 부여하므로, 이후 이 코드 세그먼트를 사용해야 할 필요성이 발생할 때 전체 코드가 아닌 해당 식별자를 간단히 호출할 수 있습니다.
모듈화는 개발자가 코드를 각각 고유한 기능을 가진 작은 단위로 구분할 수 있도록 하는 필수 기술입니다. 이 접근 방식은 개발 프로세스를 단순화할 뿐만 아니라 효율성과 가독성을 높여 소프트웨어의 전반적인 성능을 향상시킵니다. 또한 테스트 단계를 용이하게 하여 엔지니어가 문제를 더 쉽게 식별하고 격리할 수 있습니다. 따라서 이 모범 사례를 도입하면 개발 프로젝트를 크게 간소화하고 고품질 소프트웨어 제품을 생산하는 데 기여할 수 있습니다.
모듈 생성에 대해 자세히 알아보기 전에 코드를 모듈화하는 데 중요한 역할을 하는 객체 지향 프로그래밍(OOP)의 기본 사항을 이해하는 것이 필수적입니다. 때로는 코드 블록이 독립된 함수 역할을 할 수도 있지만, 클래스 메서드 내에 캡슐화될 수도 있으며, 이때 OOP가 기본 원칙으로 작용합니다.
파이썬의 객체 지향 프로그래밍
객체 지향 프로그래밍(OOP)은 전용 클래스 내에 코드를 캡슐화하여 나중에 독립적인 객체로 인스턴스화하는 것을 포함합니다. 각 객체는 고유한 속성과 메서드 집합을 가지며, 클래스는 잠재적으로 여러 메서드와 속성을 가질 수 있고 다른 클래스로부터 속성을 상속할 수 있습니다.
클래스를 정의하는 특성을 속성이라고 하며, 모든 메서드는 특정 명령을 실행하는 함수이므로 특정 클래스 속성을 활용해야 할 수 있습니다. 클래스를 임포트하고 인스턴스화하면 다른 애플리케이션이나 코드베이스 섹션 내에서 해당 클래스의 속성과 메서드에 모두 액세스하고 사용할 수 있습니다.
파이썬에서 나만의 재사용 가능한 모듈 만들기: 실용적인 예
선택한 가상 환경 관리자를 사용하여 현재 작업 디렉터리 내에 새로운 가상 환경을 설정합니다. 이전에 가상 환경이 설정된 경우 친절하게 다시 활성화하세요. 이 단계를 수행하는 동안 프로젝트 디렉터리 내에 있어야 합니다.
WordCounter 클래스를 개발하기 위해 처음에는 그 값을 계산하는 기본 공식을 고안했습니다. 정확한 단어 수가 필요하지 않을 수도 있지만, 이 개념과 소프트웨어 재사용성의 관련성이 이 맥락에서 중요하다는 점에 유의하시기 바랍니다.
앞서 설명한 단계를 더 자세히 설명한 다음에는 당면한 작업에 집중하세요. 현재 프로젝트가 진행 중인 지정된 폴더로 이동하여 작업을 진행합니다. 그런 다음 적절한 텍스트 편집기를 시작한 다음 지정된 디렉터리 내에 새 Python 파일을 만듭니다. 이 데모의 목적상 파일 이름은 “counter.py”이고 필수 접미사 “.py”가 지정되어 있다고 가정하겠습니다. 혹시 모를 불일치를 피하기 위해 앞서 언급한 사양을 준수했는지 확인하시기 바랍니다.
카운터 파일은 다음과 같은 특성을 나타냅니다:
sentence = 'how to make a reusable word counter in python'
words = sentence.split(' ')
count = sum(1 for word in words if word)
print(count) # 9
원시 코드가 기능적으로 작동하고 나중에 사용할 수 있도록 하려면 전용 Python 클래스 메서드 내에 해당 기능을 캡슐화하는 것이 좋습니다.
class WordCounter:
def count_words(self, sentence):
words = sentence.split(' ')
count = sum(1 for word in words if word)
return count
앞서 언급한 절차를 통해 단어 수 유틸리티를 개발했습니다. 이 모듈의 목적은 여러 Python 파일에서 그 기능을 시연하는 것입니다.
동일한 폴더 내에서 생성된 모듈 가져오기
이전에 개발한 모듈 ‘counter.py’에는 ‘WordCounter’라는 클래스가 포함되어 있습니다. 해당 클래스는 주어진 텍스트 콘텐츠 내에서 단어를 계산하기 위한 ‘count\_words’라는 방법론적 함수를 가지고 있습니다. 다른 파이썬 스크립트 내에서 위에서 언급한 count\_words 메서드가 필요한 경우, 후자의 스크립트 내에서 ‘WordCounter’ 클래스를 임포트하고 인스턴스화하는 과정을 통해 이를 수행할 수 있습니다.
모든 Python 파일이 같은 디렉터리에 위치하도록 하려면 기존 wordcounter.py 파일과 같은 디렉터리 내에 새 Python 파일을 만들어야 합니다. 이렇게 하면 프로그램을 올바르게 실행할 수 있습니다.
업데이트된 문서는 이제 다음 형식으로 나타납니다:
from counter import WordCounter
sentence = "how to import and reuse your code in Python"
counter = WordCounter()
print(counter.count_words(sentence)) # 9
이 클래스에 캡슐화된 기법의 활용은 상속 또는 구성을 통해 다른 클래스로 확장할 수 있습니다. 이러한 상호 운용성을 이해하려면 파이썬의 객체 지향 프로그래밍의 기본 원리를 포괄적으로 이해하는 것이 좋습니다.
다른 디렉토리에서 파이썬 모듈 재사용
객체 파일이 모듈 파일과 일치하지 않는 경우, 무조건 임포트를 사용하여 모듈을 참조해야 합니다.
프로젝트 디렉터리 내에 새 파일을 생성하고 동일한 프로젝트 디렉터리 내의 다른 폴더에 있는 다른 파일(이하 “워드카운트” 폴더라고 함)에서 모듈을 가져오려고 하는 시나리오를 생각해 보겠습니다.
“wordcount” 디렉터리 내에 있는 “counter.py” 모듈의 기능을 활용하려면 다음 단계를 수행해야 합니다:
import sys
sys.path.append(sys.path[0] + "/..")
from wordcount.counter import WordCounter
sentence = 'import and reuse your Python code from files with different paths'
counter = WordCounter()
print(counter.count_words(sentence)) # 11
`sys.path.append()` 메서드를 사용하면 현재 작업 디렉터리를 프로젝트의 상위 폴더에 추가할 수 있으므로 프로젝트 계층 구조 내의 다양한 위치에서 모듈에 액세스할 수 있습니다.
파이썬은 절대 임포트 프로세스에 따라 상위 디렉터리(단어 수 포함)를 살펴보고 원하는 모듈(counter.py)을 감지합니다.
프로젝트 디렉터리의 구조는 다음과 같이 표현할 수 있습니다:
word_count
├─ destination
│ └─ destination.py
└─ wordcount
└─ counter.py
앞서 언급한 정보는 특정 디렉토리 구조 내의 파일 구성과 관련이 있습니다. 특히 “word\_count”는 최상위 디렉터리 역할을 하며 “counter.py”라는 이름의 하위 디렉터리와 “destination.py”라는 이름의 하위 디렉터리 두 개를 포함합니다. “counter.py” 안에는 “대상.py”에서 인스턴스화를 통해 실행할 수 있는 “WordCounter” 클래스가 있습니다.
코드 재사용성은 어디에서 작동하나요?
코드를 모듈화하고 재사용하는 것은 모든 프로젝트에서 중요한 접근 방식으로 간주됩니다. 프로젝트 구조를 구성하는 방법은 다를 수 있지만, 이 매뉴얼은 모든 프로젝트 스크립트에서 개인화된 모듈을 구현하기 위한 기초 역할을 합니다. 마찬가지로 객체에 포함되지 않는 기능에도 동일한 원칙이 적용되므로 프로젝트 구성에 따라 하나의