이번 포스팅에서는 __init__.py 는 어떤 용도로 쓰이는 지 __init__.py 의 용도에 대해 공부해 보도록 하겠습니다
파이썬 패키지
__init__.py 의 용도
__init__.py 파일은 해당하는 디렉터리가 패키지의 일부 임을 알려주는 역할을 하게 됩니다 만약에 game.sound.graphic 등의 패키지가 포함되어 있는 디렉터리에 __init__.py 파일이 존재하지 않는다면 패키지로 인식 될 수가 없습니다.
python 3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식할 수 있게 끔 변경이 되었습니다. 그러나 하위 버전 호환을 위해서 __init__.py 파일을 생성하는 것이 안전한 방법일 수 있습니다.
Python
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>from game.sound import*>>> echo.echo_test()Traceback (most recent call last): File "<stdin>", line 1, in<module>NameError: name 'echo'isnot defined>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>from game.sound import*>>> echo.echo_test()Traceback (most recent call last): File "<stdin>", line 1, in<module>NameError: name 'echo'isnot defined>>>
위 코드를 실행을 해보겠습니다. Traceback (most recent call last): File “”, line 1, in NameError: name ‘echo’ is not defined 오류가 발생하게 됩니다. 우리는 분명 game.sound 패키지 안에서 모든 것(*)을 import 하였으니 echo 모듈을 사용 하는게 당연한 것처럼 생각이 들지만 echo 라는 이름이 정의 되지 않았다고 오류를 출력하게 됩니다.(NameError)
__all__ 변수
이런 식으로 특정 디렉터리의 모듈을 * 를 사용하여 import 할 때에는 아래처럼 해당하는 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import 할 수 있게 끔 모듈을 정의해 주면 됩니다.
위 코드에서 __all__ 은 sound 디렉터리에서 * 기호를 사용하여 import 할 경우에 여기에 정의되어 있는 echo 모듈 만을 import 한다는 의미로 해석하시면 됩니다.
여기서 혼동하기 쉬운 부분이 from game.sound.echo import * 는 __all__ 과는 관계없이 무조건 import 를 하게 됩니다. 이런 식으로 __all__ 과 상관 없이 무조건 import 되는 경우는 from a.b.c import * 에서 from 의 마지막 항목인 c 가 모듈인 경우 입니다.
__init__.py 파일 변경 후 실행
Python
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>from game.sound import*>>> echo.echo_test()echo>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>from game.sound import*>>> echo.echo_test()echo>>>
이제 위 코드처럼 __init__.py 파일을 변경 한 후 대화형 인터프리터를 재실행한 뒤에 다시 실행을 해 보면 우리가 원한던 결과가 정상적으로 출력됨을 알 수가 있습니다.~
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import game>>> game.sound.echo.echo_test()Traceback (most recent call last): File "<stdin>", line 1, in<module>AttributeError: module 'game' has no attribute 'sound'>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import game>>> game.sound.echo.echo_test()Traceback (most recent call last): File "<stdin>", line 1, in<module>AttributeError: module 'game' has no attribute 'sound'>>>
위 코드처럼 파이썬 인터프리터를 새로 시작한 상태에서 import game 을 실행하게 되면 game 디렉터리의 __init__.py 에 정의 되어 있는 것만 참조할 수 있습니다.
echo_test 함수가 안되는 경우 #2
Python
>>>import game.sound.echo.echo_testTraceback (most recent call last): File "<stdin>", line 1, in<module>ModuleNotFoundError: No module named 'game.sound.echo.echo_test'; 'game.sound.echo'isnot a package>>>
도트 연산자(.)를 사용해서 import a.b.c 처럼 import 할 때 가장 마지막에 항목인 c 는 반드시 모듈 또는 패키지이어야만 합니다.
오늘은 이렇게 패키지 안의 함수 실행하는 방법에 대해 알아보았습니다. echo 모듈을 import 하여 실행하는 방법부터 echo_test 함수가 안되는 경우 두 가지에 대해서 공부 해봤습니다.
다음 포스팅에서는 __init__.py 는 어떤 용도로 쓰이는지에 대해 공부해 보도록 하겠습니다
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
지난 포스팅에서는 파이썬에서 모듈을 불러오는 다른 방법에 대해 공부해 봤습니다. 이제 파이썬 패키지에 대해 공부를 해 볼텐데요 먼저 패키지의 정의와 패키지 만드는 방법에 대해 공부해 보도록 하겠습니다.
파이썬 패키지
패키지의 정의
패키지의 정의에 대해 먼저 알아 보겠습니다. 패키지는 Packages 로 도트(.) 를 사용하여 파이썬의 모듈들을 계층적 디렉터리 구조 형태로 관리를 할 수 있게 끔 해줍니다. 예로 모듈 이름이 AAA.BBB 인 경우에 A 는 패키지 이름이 되며, BBB 는 A 패키지의 B 모듈이 되는 것 입니다. 여기에서 나오는 파이썬에서 모듈의 이전에 공부 했듯이 하나의 파이썬 파일(.py) 입니다
파이썬에서 패키지는 디렉터리와 파이썬 모듈로 이루어 집니다.
패키지의 구조
패키지의 구조를 살펴보면 아래 와 같습니다. 가상으로 game 이란 패키지의 예를 보겠습니다.
위의 패키지 예를 보게 되면 game, sound, graphic, play 는 디렉터리이고 확장자가 .py 인 파일들은 파이썬 모듈입니다. game 디렉터리가 이 패키지의 루트 디렉터리이고 sound, graphic, play 는 서브 디렉터리입니다.
간단한 파이썬 프로그램이라면 굳이 이렇게 패키지로 구조로 만들 필요가 없겠지만 이렇게 패키지 구조로 파이썬 프로그램을 만들게 되면 공동 작업이나 유지 보수 등을 할 때 여러가지 유리한 점들이 생깁니다. 그리고 패키지 구조로 모듈을 만들게 되면 다른 모듈과 이름이 겹치게 되더라도 안전하게 사용이 가능합니다.
패키지 만드는 방법
이제 위의 예와 비슷한 game 패키지를 만들어 보면서 패키지에 대해 더 공부해 보도록 하겠습니다.
패키기 기본 구성 요소
1. 디렉터리 생성과 파일 생성
game 디렉터리를 생성하고 game 디렉터리 밑에 서브 디렉터리까지 생성을 해보겠습니다. 그리고 파이썬 파일들을 만들어 보겠습니다.
game 디렉터리를 생성하고 하위 폴더인 graphic 과 sound 디렉터리도 생성했습니다. 그리고 각각 디렉터리에 비어 있는 __init__.py 파일을 생성해 주었습니다.
BAT
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 03:26 <DIR> ..2023-04-28 오후 05:26 <DIR> graphic2023-04-28 오후 05:26 <DIR> sound2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game>dir /s D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 03:26 <DIR> ..2023-04-28 오후 05:26 <DIR> graphic2023-04-28 오후 05:26 <DIR> sound2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 03:26 <DIR> ..2023-04-28 오후 05:26 <DIR> graphic2023-04-28 오후 05:26 <DIR> sound2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 03:26 <DIR> ..2023-04-28 오후 05:26 <DIR> graphic2023-04-28 오후 05:26 <DIR> sound2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game\graphic 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 03:26 <DIR> ..2023-04-28 오후 05:26 <DIR> graphic2023-04-28 오후 05:26 <DIR> sound2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game\sound 디렉터리2023-04-28 오후 05:26 <DIR> .2023-04-28 오후 05:26 <DIR> ..2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음
2. echo.py 파일 생성
아래와 같이 echo.py 파일을 생성해 줍니다.
Python
# echo.pydefecho_test():print("echo")
3. render.py 파일 생성
아래와 같이 render.py 파일을 생성해 줍니다.
Python
# render.pydefrender_test():print("render")
4. 파이썬 환경변수 PYTHONPATH 에 디렉터리 추가하기
지금 진행하고 있는 game 패키지를 파이썬에서 참조할 수 있도록 명령 프롬프트 창에서 set 명령어를 통해 PYTHONAPTH 환경 변수에 현재 디렉토리를 추가해 줍니다. 그리고 파이썬 대화형 인터프리터(Interractive Shell) 을 실행을 해보겠습니다.
BAT
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>set PYTHONPATH=D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>set PYTHONPATH=D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
.study_python_3.11.0.TEST\game>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
여기까지 파이썬 패키지에 대해서 공부하기 위한 준비 작업을 마쳤습니다. 다음 포스팅에 이어서 패키지에 대한 공부를 이어가 보겠습니다.
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
파이썬을 이것 저것 만지려 하다 보면 저 같은 경우는 주로 비주얼스튜디오코드에서 코딩 연습을 하지만 명령 프롬프트에서 파이썬을 실행시켜 코딩 연습을 할 때도 있습니다.
그런데 아나콘다를 통해 가상 환경을 셋팅을 하고 코딩 연습을 하는데 일반 윈도우 명령 프롬프트에서 파이썬을 실행시키면 가상 환경을 셋팅한 의미가 없어지겠죠
그래서 아나콘다 자동 실행 Batch 파일을 만드는 것도 진행을 해봤구요
파이썬 아나콘다 자동실행 Batch 만들기 – SmartDev
자동화를 하고 싶어서 프로그래밍을 하는데 그 자동화를 매일 수작업으로 돌려줘야 한다는 슬픈 현실 아나콘다 자동실행 Batch
그럼 이번 포스팅에서는 일반 윈도우 명령 프롬프트가 아닌 아나콘다 프롬프트를 실행시켜서 이미 셋팅해 놓은 가상 환경에 바로 전환이 되는 작업을 같이 해보겠습니다.
아나콘다 명령프롬프트 바로 가기 복사
먼저 아나콘다 프롬프트 바로 가기의 위치를 열어 줍니다. (방법은 위 링크에 해놓은 ‘파이썬 아나콘다 자동 실행 Batch 만들기’에서 확인하실 수 있습니다.) 일단 기존에 있던 바로 가기를 하나 더 복사해서 사용을 하고 이름은 Anaconda Prompt study 로 바꾸겠습니다.
줄 바꿈을 해보면 위처럼 명령들이 나오는데 첫번째 줄의 cmd.exe 는 윈도우에 있는 명령 프롬프트 창을 말합니다. 두번째 줄의 “/K” 는 첫번째 줄에서 실행한 명령 프롬프트 창에 이후에 입력하는 명령어 들을 입력을 하라는 의미입니다.
그럼 먼저 명령 프롬프트를 열고 C:\Users\donnr\anaconda3\Scripts\activate.bat 을 실행해서 윈도우 명령 프롬프트 창을 아나콘다 프롬프트로 바꾸어 주는 역할을 하게 됩니다. 마지막 줄의 anaconda3 는 기본 가상 환경인 base 로 가상 환경을 설정을 해준다는 의미입니다.
바로가기 속성 대상 변경하기
이제 여기서 해줘야 할 일은 기본 base 로 가상 환경이 설정되는 것을 이미 만들어 놓은 가상 환경으로 바꿔주는 일 입니다. 위 대상에 나와있는 명령 중 마지막 C:\Users\donnr\anaconda3 이 부분만 변경해 주면 됩니다.
C:\Users\donnr\anaconda3\envs\설정할 가상 환경 폴더 이름
가상 환경 폴더 이름은 이미 우리가 설정했었던 가상 환경 이름입니다. 저의 경우는 ‘py_study_31010’ 으로 했었습니다. 파이썬 버전까지 같이 이름에 넣어뒀죠 ㅎ 그럼 가상 환경 이름으로 변경을 해주면 아래처럼 됩니다.
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>mkdir module(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>move module2.py module1개 파일을 이동했습니다.
.study_python_3.11.0.TEST>move module2.py module1개 파일을 이동했습니다.
sys.path.append 사용하기
모듈을 불러오는 다른 방법 첫번째는 sys.path.append 를 사용하는 방법입니다. 일단 파이썬 쉘을 실행한 뒤 sys 모듈을 불러오겠습니다.
Python
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import sys>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import sys>>>
위에서 import 한 sys 모듈은 파이썬이 최초 설치될 때 함께 설치되는 라이브러리 모듈입니다. sys 모듈을 사용을 하게 되면 파이썬 라이브러리가 설치되어 있는 폴더를 확인할 수 있습니다.
sys.path 를 실행시키게 되면 파이썬 라이브러리가 설치 되어 있는 폴더들을 출력 해 줍니다. 만약에 파이썬 모듈이 위에 출력된 폴더에 있다면 모듈이 저장된 폴더로 이동을 하지 않고도 바로 해당 모듈을 불러서 사용을 할 수가 있을 것입니다. 그럼 sys.path 에 이전에 mkdir 로 생성했던 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module 라는 폴더를 추가해 주게 된다면 어느 폴더에서든지 해당 모듈을 불러와서 사용할 수 있지 않을까요?
위에서 보여지는 것처럼 sys.path 는 리스트 형식으로 저장되어 있는걸 알 수 있고 리스트는 수정이 가능합니다.
sys.path.append 라고 명령을 해서 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module 라는 폴더를 path 에 추가를 해주었습니다. sys.path 라고 실행해 보면 방금 추가한 폴더가 추가되었음을 확인 할 수 있습니다. 여기서 주의할 점은 그냥 경로를 붙여넣기 해버리면 \\ 로 들어가는데 / 로 변경해서 append 를 해주시면 위처럼 D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST/module 이렇게 경로가 추가됨을 알 수 있습니다.
이제 정말 모듈을 불러와서 사용할 수 있는지 확인 해 보겠습니다.
Python
>>>import module2>>>print(module2.add(3, 4))7>>>
위처럼 정상적으로 모듈을 불러와서 사용할 수 있는게 확인이 되었습니다.
PYTHONPATH 환경 변수 사용하기
모듈을 다른 방법으로 불러오는 또 하나의 방법은 PYTHONPATH 환경 변수를 사용하는 방법이 있습니다.
Python
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>set PYTHONPATH=D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.add(3, 4))7>>>
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>set PYTHONPATH=D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.add(3, 4))7>>>
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>set PYTHONPATH=D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.add(3, 4))7>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.add(3, 4))7>>>
위에서 처럼 set 명령어를 사용해서 PYTHONPATH 환경 변수에 module2.py 파일이 존재하는 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\module 폴더를 설정해 주었습니다. 이렇게 해주면 폴더 이동이나 다른 모듈 추가 작업이 없이도 module2 모듈을 불러와서 사용할 수 있게 됩니다.
맥이나 유닉스 환경에서는 set 명령 대신 export 명령을 사용해야 합니다.
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
지난 포스팅에서는 파이썬 모듈 에서 name 변수 (if __name__ == “__main__”:) 에 대해 공부해 보았습니다. 이번 포스팅에서는 파이썬 모듈 에서 클래스나 변수 등을 포함한 모듈에 대해 공부해 보겠습니다.
파이썬 모듈
클래스나 변수 등을 포함한 모듈
지난 시간 까지 알아봤던 파이썬 모듈에서는 함수만 포함을 했었지만 클래스나 변수 등을 포함한 모듈도 있습니다.
Python
# module2.pypi =3.141592classMath:defsolv(self, r):return pi * (r **2)defadd(a, b):return a + b
위의 코드는 원의 넓이를 계산해 주는 Math 클래스와 두개의 수를 더해주는 add 함수, 원주율 값에 해당하는 pi 변수 처럼 클래스, 함수, 변수 를 모두 포함하고 있습니다. 주석에 표시된 것처럼 module2.py로 저장을 한뒤 가상환경 프롬프트를 실행해서 대화형 인터프리터를 열어서 아래처럼 연습해 보겠습니다.
(py_study_3110) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.pi)3.141592>>>
(py_study_3110) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.pi)3.141592>>>
.study_python_3.11.0.TEST>pythonPython 3.11.0 | packaged by Anaconda, Inc. | (main, Mar 12023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module2>>>print(module2.pi)3.141592>>>
위에서 작성한 것 처럼 module2.pi 라고 입력을 해서 module2.py 파일에 생성되어 있는 pi 변수 값을 사용을 할 수가 있습니다.
Python
>>> a = module2.Math()>>>print(a.solv(2))12.566368>>>
위 작성한 코드는 module2.py 에 생성되어 있는 Math 클래스를 사용하는 방법을 보여주는 코드입니다. 위처럼 모듈 안에 있는 클래스를 사용하고자 한다면 “.”(도트 연산자)로 클래스 이름 앞에 모듈 이름을 우선 입력해 주어야 합니다.
위 코드처럼 module2.py 에 생성되어 있는 add 함수도 사용할 수 있음을 알 수 있습니다.
다른 파일에서 모듈 불러오기
지금까지 직접 만든 모듈 파일을 불러오기 위해서 대화형 인터프리터를 사용했었습니다. 이제 다른 파이썬 파일에서 기존에 만들어 놨던 모듈을 불러서 사용하는 방법에 대해 공부해 보겠습니다. 좀전에 만들어 봤던 module2.py 파일을 다른 파이썬 파일에서 불러와 사용을 해보도록 하겠습니다.
당연히 예상한 대로 print 문을 통한 add 와 subtrack 함수의 결과값이 잘 출력이 되었습니다. 그럼 이전 포스팅에서 처럼 파이썬 대화형 인터프리터에서 module1.py 파일을 실행을 해보겠습니다.
Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 212023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module152>>>
.study_python_3.11.0.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 212023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits"or"license"for more information.>>>import module152>>>
이상하죠? import module1 을 실행하는 순간 module1.py 파일이 실행되어 결과값을 출력을 하게 됩니다. 원래 목적은 module1.py 파일의 add 함수와 subtrack 함수를 사용하려고 하는 목적인데 말이죠 이런 문제를 방지하기 위해 module1.py 파일을 아래 코드처럼 변경해야 합니다.
Python
# module1.pydefadd(x, y):return x + ydefsubtrack(x, y):return x - yif__name__=="__main__":print(add(1, 4))print(subtrack(4, 2))
if __name__ == “__main__”: 이라는 문장을 사용하게 되면 이전에 명령 프롬프트에서 python module1.py 라고 실행했을 때와 마찬가지로 __name__ == “__main__” 이 문장이 참이 되어 if 문 다음 문장이 수행이 됩니다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용을 하게 될 때에는 __name__ == “__main__” 이 거짓이 되어 if 문 다음에 있는 문장들이 수행이 되지 않게 됩니다.
위 코드처럼 module1.py 를 수정을 했으면 대화형 인터프리터를 열고 실행을 해보겠습니다.
Python
>>>import module1>>>
이제 아무런 결과값도 출력하지 않습니다.
name 변수? __name__ 변수란?
파이썬에서 사용하는 __name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수 이름입니다. 만일 명령프롬프트에서 python module1.py 라고 직접 module1.py 파일을 실행하는 경우에 module1.py 의 __name__ 변수에는 __main__ 이라는 값이 저장이 됩니다. 그러나 파이썬 쉘이나 다른 파이썬 모듈에서 module1 을 import 하는 경우에는 module1.py 의 __name__ 변수에는 module1.py 의 모듈 이름값인 module1 이 저장이 되게 됩니다.
Python
>>>import module1>>> module1.__name__'module1'>>>
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
모듈이라는 것은 이전에 공부했던 함수나 변수, 또는 클래스를 모아 놓은 파이썬 파일이라고 보시면 됩니다. 다르게 해석하자면 모듈은 다른 파이썬 프로그램에서 불러와서 사용할 수 있게끔 만들어진 파이썬 파일이라고 보시면 됩니다.
파이썬 프로그래밍을 진행을 하다 보면 굉장히 많은 수의 모듈을 사용을 하게 됩니다. 이렇게 사용되는 모듈은 기존에 다른 개발자들이 이미 만들어 놓은 모듈일 수도 있고 우리가 프로그래밍을 하면서 직접 만들어 사용하는 모듈일 수도 있습니다.
모듈 만들기
일단 간단하게 모듈 만들기를 해보겠습니다
Python
# module1.pydefadd(x, y):return x + ydefsubtrack(x, y):return x - y
위 코드는 add 와 subtrack 함수만 존재하는 module1.py 파일입니다. 위처럼 파이썬 파일을 만들었는데 이 파일이 모듈입니다. 에디터로 파이썬 파일을 만들었었다면 다른 것이 없습니다. 즉 파이썬 확장자인 ~.py 로 만든 파이썬 파일은 모두 모듈이라고 보시면 됩니다.
모듈 불러오기
방금 위에서 만든 module1.py 파일, 즉 모듈을 파이썬에서 어떻게 불러와야 할까요? 우선 명령프롬프트 창을 열고 모듈을 만든 폴더로 이동을 해서 대화형 인터프리터를 실행해 보겠습니다.
저희는 아나콘다를 통해 비주얼스튜디오코드를 사용하기 때문에 아나콘다 프롬프트를 사용해 보겠습니다. 아나콘다를 통한 비주얼스튜디오코드 에 관한 지난 포스팅이 있으니 참고 해보시기 바라며 다음으로 넘어가겠습니다.
3. 파이썬 아나콘다 설치로 가상 환경 설정. Why?
지난 포스팅에서 간단하게 파이썬에 대한 맛보기를 진행해봤습니다.비주얼스튜디오코드(Visual Studio Code)의 터미널을 이용해서 내컴퓨터에 설치되어있는 파이썬의 버전도 확인해보고 라이브러리를 설치하기 위한 pip 문도 사용해봤습니다.비주얼스튜디오코드(Visual Studio Code) 터미널에서 파이썬을 구동시켜 간단한 기초실습도 해봤습니다. 아나콘다 설치 이유 이번에는 파이썬 아나콘다 설치로 파이썬 가상 환경 설정을 해보겠습니다.먼저 가상 환경 설정 을 하는 이유에 대해 알아보면파이썬으로 이것저것 코딩을 하다 보면 각종 … Read more
아래 처럼 아나콘다 프롬프트를 실행하고 가상환경을 불러와 줍니다.
conda activate py_study_31010
그리고 모듈을 생성한 폴더로 이동합니다.
d: cd D:\Dropbox.My_Job.Study.Python
d: cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\
(base) C:\Users\donnr>conda activate py_study_31010(py_study_31010) C:\Users\donnr>d:(py_study_31010) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>dir D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 32C2-7736 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST 디렉터리2023-04-26 오후 09:45 <DIR> .2023-04-26 오후 09:18 <DIR> ..2023-04-18 오후 09:45 30 ex_test.txt2023-04-26 오후 09:45 87 module1.py2023-04-25 오전 08:20 4,441 test.py2023-04-18 오후 10:09 30 test.txt2023-04-18 오후 07:42 102 test_02.py2023-04-18 오후 10:01 49 write_text.txt2023-04-17 오후 03:25 0 신규파일.txt 7개 파일 4,739 바이트 2개 디렉터리 326,446,088,192 바이트 남음(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 21 2023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
(base) C:\Users\donnr>conda activate py_study_31010(py_study_31010) C:\Users\donnr>d:(py_study_31010) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>dir D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 32C2-7736 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST 디렉터리2023-04-26 오후 09:45 <DIR> .2023-04-26 오후 09:18 <DIR> ..2023-04-18 오후 09:45 30 ex_test.txt2023-04-26 오후 09:45 87 module1.py2023-04-25 오전 08:20 4,441 test.py2023-04-18 오후 10:09 30 test.txt2023-04-18 오후 07:42 102 test_02.py2023-04-18 오후 10:01 49 write_text.txt2023-04-17 오후 03:25 0 신규파일.txt 7개 파일 4,739 바이트 2개 디렉터리 326,446,088,192 바이트 남음(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 21 2023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
.study_python_3.11.0.TEST>dir D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 32C2-7736 D:\Dropbox.My_Job.Study.Python
(base) C:\Users\donnr>conda activate py_study_31010(py_study_31010) C:\Users\donnr>d:(py_study_31010) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>dir D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 32C2-7736 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST 디렉터리2023-04-26 오후 09:45 <DIR> .2023-04-26 오후 09:18 <DIR> ..2023-04-18 오후 09:45 30 ex_test.txt2023-04-26 오후 09:45 87 module1.py2023-04-25 오전 08:20 4,441 test.py2023-04-18 오후 10:09 30 test.txt2023-04-18 오후 07:42 102 test_02.py2023-04-18 오후 10:01 49 write_text.txt2023-04-17 오후 03:25 0 신규파일.txt 7개 파일 4,739 바이트 2개 디렉터리 326,446,088,192 바이트 남음(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 21 2023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
.study_python_3.11.0.TEST 디렉터리2023-04-26 오후 09:45 <DIR> .2023-04-26 오후 09:18 <DIR> ..2023-04-18 오후 09:45 30 ex_test.txt2023-04-26 오후 09:45 87 module1.py2023-04-25 오전 08:20 4,441 test.py2023-04-18 오후 10:09 30 test.txt2023-04-18 오후 07:42 102 test_02.py2023-04-18 오후 10:01 49 write_text.txt2023-04-17 오후 03:25 0 신규파일.txt 7개 파일 4,739 바이트 2개 디렉터리 326,446,088,192 바이트 남음(py_study_31010) D:\Dropbox.My_Job.Study.Python
(base) C:\Users\donnr>conda activate py_study_31010(py_study_31010) C:\Users\donnr>d:(py_study_31010) D:\>cd D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>dir D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 32C2-7736 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST 디렉터리2023-04-26 오후 09:45 <DIR> .2023-04-26 오후 09:18 <DIR> ..2023-04-18 오후 09:45 30 ex_test.txt2023-04-26 오후 09:45 87 module1.py2023-04-25 오전 08:20 4,441 test.py2023-04-18 오후 10:09 30 test.txt2023-04-18 오후 07:42 102 test_02.py2023-04-18 오후 10:01 49 write_text.txt2023-04-17 오후 03:25 0 신규파일.txt 7개 파일 4,739 바이트 2개 디렉터리 326,446,088,192 바이트 남음(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 21 2023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
.study_python_3.11.0.TEST>pythonPython 3.10.10 | packaged by Anaconda, Inc. | (main, Mar 21 2023, 18:39:17) [MSC v.1916 64 bit (AMD64)] on win32Type"help", "copyright", "credits" or "license"formore information.>>>
이처럼 파이썬의 대화형 인터프리터에서는 파이썬 파일을 저장한 폴더로 이동을 해야 모듈을 읽어올 수 있습니다.
위 코드처럼 module1.py 로 생성한 모듈을 불러오기 위해 import module1 이라고 했습니다. 실수로라도 .py 를 붙이면 안됨을 명심해 주세요 import 는 만들어져 있는 파이썬 모듈을 사용할 수 있게 해주는 명령입니다. module1.py 파일에 있는 add 함수와 subtrack 함수를 사용하기 위해 위 코드 처럼 module1.add, module1.subtrack 같이 모듈 이름 뒤에 “.”(도트 연산자) 를 붙이고 함수 이름을 쓰시면 됩니다.
import 는 현재 디렉토리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉토리에 있는 모듈만 불러올 수 있습니다. 파이썬 라이브러리는 파이썬을 설치 할 때 자동으로 설치되는 파이썬의 모듈들을 얘기합니다.
import 사용법
import 의 사용법은 간단합니다.
Python
import 모듈 이름
앞에서 보았듯이 여기에서 모듈 이름은 파일이름 module1.py 에서 .py 확장자를 제거한 module1 만을 말합니다.
모듈 이름 없이 함수 이름 사용
매번 모든 경우에 module1.add, module1.subtrack 처럼 쓰는 것은 아닙니다. 그냥 add, subtrack 처럼 모듈 없이 함수 이름만 쓰고 싶은 경우도 있습니다. 이럴 때 아래 처럼 사용하시면 됩니다.
Python
from 모듈 이름 import 모듈 함수
아래의 코드를 보면 이해가 되실 겁니다.
Python
>>>from module1 import add>>> add(3, 4)7>>>
그러면 add 와 subtrack 함수를 둘 다 사용하려면 어떻게 할까요?
Python
from module1 import add, subtrackfrom module1 import*
위 예처럼 두가지 방법이 있습니다. 첫번째 처럼 콤마로 모듈 함수를 불러오는것이 있고 두번째 처럼 “*” 문자를 사용할 수도 있습니다.
* 문자는 모든 것을 의미합니다. 파이썬에서도 마찬가지로 사용됩니다.
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
이전까지 공부한 내용에서 객체 변수는 다른 객체들의 영향을 받지 않고 각각 독립적으로 각자의 값을 유지를 하고 있다는 것을 알게 되었습니다. 이제 객체 변수와는 그 성격이 다른 클래스 변수에 대해 공부해 보겠습니다.
클래스 변수 만들기
Python
>>>classMyFamily:... lastname ="이"...
MyFamily 라는 클래스를 선언을 했고 그 안에 lastname 이라는 변수가 바로 클래스 변수 입니다. 클래스 변수는 클래스 안에서 함수를 선언하는 것 처럼 클래스 안에 변수를 선언하고 생성을 하게 됩니다.
Python
>>>print(MyFamily.lastname)이>>>
위 코드처럼 클래스 변수를 print 문을 통해 출력을 해보았습니다. 위 예제에 있는 것 처럼 클래스 변수는 클래스이름.클래스 변수 로 사용하시면 됩니다.
Python
>>> a = MyFamily()>>> b = MyFamily()>>>print(a.lastname)이>>>print(b.lastname)이>>>
클래스 변수의 내용 변경하기
또한 위 코드처럼 MyFamily 클래스로 만든 객체를 통해서도 클래스 변수를 사용할 수 있습니다. 그럼 만약에 MyFamily 클래스의 lastname 이라는 클래스 변수의 내용을 다른 문자열로 바꾸면 어떻게 될까요? 아래는 클래스 변수의 내용을 “박” 이라는 문자열로 바꿔본 내용입니다.
클래수 변수의 내용을 변경 했습니다. 결과는 클래스로 만든 객체의 lastname 값도 모두 변경되었음을 확인 할 수 있습니다. 이처럼 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특성을 가지고 있습니다.
클래스 변수와 같은 이름의 객체 변수를 생성한다면 어떻게 될까?
만약 클래스 변수와 같은 이름의 객체 변수를 생성하면 어떻게 될까요? 아래 코드처럼 이전 사용했던 a.lastname 을 변경해 보겠습니다.
Python
>>> a.lastname ="오"print(a.lastname)오>>>
얼핏 보면 MyFamily 클래스의 lastname 클래스 변수가 바뀐것 같아 보이지만 a 객체에 lastname 이라는 객체 변수가 새롭게 생성된 것입니다. 이말은 객체 변수는 클래스 변수와 같은 이름으로 생성을 해도 된다는 것입니다. a.lastname 이라는 객체 변수를 생성을 해도 MyFamily 클래스의 lastname 과는 상관이 없습니다. 아래 코드를 보시면 확인이 되실겁니다.
먼저 이전에 만들었던 사칙연산 클래스인 Four_Calculator 클래스를 예를 들어 실행해 보겠습니다.
Python
>>> a = Four_Calculator(4, 0)>>> a.divide()Traceback (most recent call last): File "<stdin>", line 1, in<module> File "<stdin>", line 18, in divideZeroDivisionError: division by zero
Four_Calculator 클래스의 a 객체에 숫자 4 와 0 을 입력하고 divide(나누기) 메서드를 호출하게 되면 숫자 4 를 0 으로 나누려는 시도 때문에 이처럼 ZeroDivisionError 오류가 발생하게 됩니다. 그럼 여기서 0 으로 나눌 때 오류가 아니라 0 을 리턴하도록 만들려면 어떻게 해야 할까요?
아래처럼 Four_Calculator 클래스를 상속하는 Safe_Four_Calculator 클래스를 만들어 보도록 하겠습니다.
Python
>>>classSafe_Four_Calculator(Four_Calculator):...defdivide(self):...ifself.second ==0: # 나누는 숫자가 0 인 경우 0 을 리턴하도록 수정...return0...else:...returnself.first /self.second...>>>
Safe_Four_Calculator 클래스는 Four_Calculator 클래스에 있는 divide 메서드와 동일한 이름으로 다시 만들었습니다. 이런 식으로 부모 클래스(상속한 클래스) 에 있는 메서드를 같은 이름으로 다시 생성하는 것을 메서드 오버라이딩(Overriding, 덮어쓰기) 라고 합니다. 이런 식으로 메서드를 오버라이딩 하게 되면 부모클래스의 메서드 대신해서 오버라이딩한 메서드가 호출되게 됩니다. 이전 포스팅에서 진행했던 상속과는 차이가 있습니다.
Safe_Four_Calculator 클래스에 메서드 오버라이딩 한 divide 메서드는 나눌려고 하는 값이 숫자 0 인 경우에는 0 을 리턴하도록 수정되어 있습니다. 이제 다시 Four_Calculator 클래스 대신 Safe_Four_Calculator 클래스를 사용하여 아까 ZeroDivisionError 가 났던 예제를 수행해 보겠습니다.
Python
>>> a = Safe_Four_Calculator(4, 0)>>> a.divide()0
앞서 진행했던 Four_Calculator 클래스와는 다르게 ZeroDivisionError 가 발생하지 않고 우리가 의도한 대로 0 으로 나누려고 하면 0 이 리턴 되는 것을 확인 할 수 있습니다.
여기까지 파이썬 클래스의 메서드 오버라이딩 에 대해 공부해 봤습니다. 메서드 오버라이딩과 클래스의 상속은 비슷하기는 하지만 클래스의 상속같은 경우는 기존 클래스의 기능을 유지한 채 기능을 확장 하는 역할을 했다면 메서드 오버라이딩의 경우 동일한 이름의 메서드를 만들어서 기능을 덮어 씌우는 역할을 한다고 보시면 될 거 같습니다. 메서드 오버라이딩을 하게 되면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출 된다는 것도 필히 염두해 두어야 겠습니다.
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.