상세 컨텐츠

본문 제목

[Python 파이썬 독학 9-1일차]

파이썬 스터디/파이썬-Python 기본편

by 후즈테크 2020. 10. 7. 23:41

본문

반응형

1. 모듈

 : 필요한 부품처럼 부분 부분 나뉘어져 잘 만들어진 파일, ex 자동차 타이어, 범퍼 등 부품만 교체, 추가 할 경우, 필요한 부분만 수정, 교체 가능.

 : 코드의 재사용, 변경이 용이함, 확장자는 .py

 

  - workspace 그룹에서 New File 선택 후, 임의 모듈(theater_module.py) 생성

 

 # 영화 가격 모듈 생성

# 일반 가격
def price(people):
    print("{0}명 가격은 {1}원 입니다." .format(people, people * 10000))

# 조조 할인 가격
def price_morning(people):
    print("{0}명 조조할인 가격은 {1}원 입니다." .format(people, people * 6000))

# 군인 할인 가격
def price_soldier(people):
    print("{0}명 군인 할인 가격은 {1}원 입니다." .format(people, people * 4000))

 - 정상가격, 조조할인가격, 군인할인가격에 대한 함수 생성 후, 실제 작업용 py로 이동(practice.py 등)

   * 해당 모듈 적용은 같은 workspace 나 같은 폴더내에 존재해야함.

반응형

 

 

1-1. 모듈 호출방법 1

import theater_module

theater_module.price(3) # 3명이서 영화 보러 갔을 때 가격

theater_module.price_morning(4)  #4명이서 조조할인 영화 보러 갔을 때 가격

theater_module.price_soldier(5)  #5명의 군인이 영화 보러 갔을 때 가격

'''결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''

  - import + module 명 (ex, import theater_module)

  - module 명 . 함수명 (ex, theater_module.price(3))

  - 실제 practice.py에 함수 정의가 되지 않아도 다른 모듈에서 정의된 함수를 호출 할 수 있음.

  * 나도코딩님의 경우, 해당 함수 모듈 호출 시 정상동작하였으나, 실제 테스트를 할 때에는 price 함수 등이 정의되지 않았다는 메세지가 발생하였다. theater_module.py 를 save 또는 실행( 삼각형, Run Python file in terminal) 후, 정상적으로 호출되었다.

 

1-2. 모듈 호출 방법 2(module 명 대신 별병(별칭) 사용)

import theater_module as mv # 별칭을 통해 줄여서 사용할 수 있음.

mv.price(3)
mv.price_morning(4)
mv.price_soldier(5)

''' 결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''

  - as 를 통해 module 명을 간략화 할 수 있고, 호출이 많아 질 경우 더욱 간편하게 사용가능하다.(결과 값 동일)

 

1-3. 모듈 호출 방법 3( from module명 import *) / 1-1 과 비교

from theater_module import * # 모듈 명 없이 해당 함수를 사용가능
#from random import * # 기존에 random 함수 호출 시 사용

price(3)
price_morning(4)
price_soldier(5)

''' 결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''

  - from module명 import * 형태로 모듈을 불러 올 경우, 모듈명 표기 없이 함수를 바로 호출 가능함(price(3))

  - import * 의 경우, module의 모든 함수를 호출 할 수 있음.

  - 1-1 import module명 으로 나타낼 경우에는 module명.함수명 형태로 호출(ex, theater_module.price(3))

 

1-4. 모듈 호출 방법 4(특정 함수만 import 할 경우)

from theater_module import price, price_morning # 처럼 필요한 함수만 가져 올 수 있음.

price(5)
price_morning(6)
price_soldier(7) # error 발생함

''' 결과 값 :
5명 가격은 50000원 입니다.
6명 조조할인 가격은 36000원 입니다.
Traceback (most recent call last):
  File "d:/python/workspace/practice.py", line 37, in <module>
    price_soldier(7) # error 발생함
NameError: name 'price_soldier' is not defined
'''

  - import 뒤에 필요한 함수만 기입하여 호출할 수 있음.

  - price_soldier의 경우, import 하지 않았으므로, 호출 시, 정의되지 않았다는 오류 메세지가 발생함.

 

1-5. 모듈 호출 방법 5(특정 함수 별명(별칭))

from theater_module import price_soldier as price 
# price_soldier만 가져와서 별칭을 설정할 수 있음.
# theater_module 의 price_soldier 의 별칭을 price으로 설정함.
# 호출 시, 적용되는 price 함수는, theater_module의 price 함수가 아닌 price_soldier가 적용됨.

price(5)

# 결과 값 : 5명 군인 할인 가격은 20000원 입니다.

  - module의 특정 함수만 호출 할 수 있음.

  - import된 함수의  별칭 사용가능함.

 

2. package

  : 모듈의 집합 하나의 디렉토리에 여러 모듈을 모아둔 것

 

# 패키지 실습 : 해외 여행

 - 1. New Folder 를 이용하여 travel workspace 를 생성

 - 2. 생성된 Folder 하위단에 New File 을 이용하여, __init__.py, thailand.py, vietnam.py 파일을 생성

  - 3. thailand.py 안에 ThailandPackage class 생성

class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어)  50만원")

  - 4. vietnam.py 안에 Vietnam.pyPackage class 생성

class VetnamPackage:
    def detail(self):
        print("[베트남 패키지 3박 5일] 다낭 효도 여행 60만원")
        

 - 5-1. 작업 py(practice.py)에서 해당 travel package를 import 방법 1

import travel.thailand  # 모듈이나 패키지만 가능, 클래스, 함수는 직접 import 불가
trip_to = travel.thailand.ThailandPackage()   # 패키지의 class 함수 사용 가능
trip_to.detail()
# 결과 값 : [태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어)  50만원

  - 생성된 travel(workspace).thailand(module명) 을 import 

    * import module 의 경우, 1-1 과 같이 import 된 모듈을 함수앞에 표기해 주어야함.

  - import 뒤에는 module, package 만 가능. class 와 함수는  사용불가.

  - import travel.thailand.ThailandPackage 의 형태는 사용 불가. ThailandPackage가 class 이므로 적용 할 수 없음.

    * import 에서 사용을 원할 경우, 위의 코딩과 같이 변수 선언 후, module+함수 형태로 사용가능.

  - 함수 테스트 시 class 뒤에 바로 함수 호출로도 사용이 가능하나, 편의를 위해 변수를 생성한 것으로 생각됨.

    ex) trip_to = travel.thailand.ThailandPackage().detail() 또는 변수 선언 없이 travel.thailand.ThailandPackage().detail()만 작성하여도 동일한 출력이 가능하다.

 

 - 5-2. 작업 py(practice.py)에서 해당 travel package를 import 방법 2

# import travel.thailand 와는 달리 from + module명 + import 에서는 class 호출도 가능함.
from travel.thailand import ThailandPackage  # 모듈 패키지 클래스 함수 모두 가능
trip_to = ThailandPackage()
trip_to.detail()
# 결과 값 : [태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어)  50만원

  - 5번 코딩과 동일한 내용이며, import + module명 대신 from + module명 + import 를 사용하기 때문에 class 나 함수도 호출 가능하다.

 

 

 - 6. from + workspace 명 + import + module 명(5-2 와 같은 형태로 표현할 수 있음)

from travel import vietnam # module 명으로도 import 가능
trip_to = vietnam.VetnamPackage() # module 명으로 호출했기 때문에 해당 module 내 class 호출 필요
trip_to.detail()

# 결과 값 : [베트남 패키지 3박 5일] 다낭 효도 여행 60만원

 - from + import 의 경우, 5-2, 6 의 코딩에서와 같이 package, module, class, 함수 모두 처리 가능하다.

 

 

 

 - 7. import * (실행 시 오류 발생)

from travel import * # 공개 범위 설정 해주어야함
trip_to = vietnam.VetnamPackage() # 공개 범위 설정 해주어야함
trip_to.detail()

''' 결과 값 : 
    
    trip_to = vietnam.VetnamPackage()
	NameError: name 'vietnam' is not defined
'''

  * 앞선 강의간, from random import * 은 random module의 모든 함수를 사용하는 것으로 사용하였으나,

    동일한 방법으로 from travel import * 을 사용하면 위와 같은 error 메세지가 발생한다.

    import * 은 모듈(패키지)의 모든 함수를 사용한다는 내용이지만, 실제 사용하는 모든 함수에 대한 구분이 필요하다.

    이 구분을 통해 사용자에게 사용 여부에 대한 권한이 필요하다.

 

 - 8. __init__.py 설정

__all__ = ["vietnam"]   # 모듈 이름

  - __init__py 를 생성하는 이유는 

  • __init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할
  • 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않을 수도 있음

  - __all__ = []

  • 특정 디렉터리의 모듈을 *를 이용하여 import할 때에는 다음과 같이 해당 디렉터리의 __init__.py 파일에 __all__이라는 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
  • __all__로 정의하지 않으면 인식되지 않음.

 - __all__ 리스트에 vietnam (모듈 이름) 을 추가 해주면 동일한 7번 코드 실행 시에도 정상동작한다.

 - __init__.py 설정 후, 7번 코딩 실행.

from travel import * 
trip_to = vietnam.VetnamPackage() 
trip_to.detail()

# 결과 값 : [베트남 패키지 3박 5일] 다낭 효도 여행 60만원

 

- 9. module 직접 실행

class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어)  50만원")



# if 문을 이용해서 외부인지 내부에서 실행인지 확인 할 수 있음.

if __name__ =="__main__" :
    print("Thailand 모듈을 직접 실행")
    print("이 문장은 모듈을 직접 실행할 때만 실행돼요")

    trip_to = ThailandPackage()
    trip_to.detail()

else :
    print("Thailand 외부에서 모듈 호출")

  - if 문을 통해 해당 module이 module 내에서 실행되었는지, 외부에서 실행되었는지 확인 할 수 있다.

 

 - 9-1. 내부에서 호출(직접 호출)

 - 9-2. 외부에서 호출

  - __name__ : 현재 모듈의 이름을 담고있는 내장 변수

  - __main__ : 직접 실행된 모듈(모듈의 이름(파일명)을 가지게 된다.)

  - __name__ == __main__ 일 경우, 내부 호출로, 다를 경우 외부 호출로 출력문이 다르게 나오는 걸 확인 할 수 있다.

  - 해당 if문을 통해 실제 적용 하기 전 내부에서 테스트가 가능하다.

 

 

3. 패키지 모듈 위치

import inspect

import random
from travel import * # 공개 범위 설정 해주어야함

print(inspect.getfile(random))  # randdom 모듈의 위치 확인
print(inspect.getfile(thailand)) 

''' 결과 값 :
D:\python\workspace>D:/Python38/python.exe d:/python/workspace/practice.py
Thailand 외부에서 모듈 호출
D:\Python38\lib\random.py
d:\python\workspace\travel\thailand.py
'''

 - 현재 작업 진행 중인, practice.py 모듈에 모듈 위치를 확인할 수 있는 inspect 모듈 import 

 - random, travel module을 각각 getfile을 이용하여 출력하면 Python38\lib 와 python\workspace\travel 로 2 모듈의 위치가 다름을 알 수 있다.

 

3-1. 실제 모듈 위치 변경(복사, 및 이동)

 - travel workspace 에서 우측 마우스 클릭 후, 탐색기를 실행.

 - 해당 폴더 전체를 복사한다. 

 - 복사된 폴더를 원하는 위치(D:\Python38\lib\) 에 붙여넣기 한다.

 

 - 붙여 넣기 후, 기존의 travel workspace 의 이름을 travel_temp로 변경 한 후, 처음 위치를 확인했던 practice.py 모듈에서 동일한 코딩으로 위치를 확인한다.

 

 - travel 모듈의 결과 값의 위치가 'D:\python\workspace\travel' 에서 'D:\Python38\lib' 으로 변경된 것을 확인할 수 있다.

반응형

관련글 더보기

댓글 영역