이번 포스팅에는 Python을 하면 많은 사람들이 봤을 methods에 대한 공부를 하면서 생긴 고찰을 한번 써보도록 하겠다. 여기서 내가 말하는 한번쯤 봤을만한 methods는 __init__, __name__, __main__(이거는 if __name__ == "__main__"에서 말하는것이다. )
다음을 한번 살펴보자
#1-1 first.py
class addition:
def __init__(self, a, b):
self.a = a
self.b = b
def add(self):
result = self.a + self.b
return result
if __name__=="__main__":
print(addition(1,2).add())
print(__name__)
이 경우를 보면, python first.py를 실행하니 바로 3, __main__를 순서대로 출력한다. 여기서 우리가 알 수 있는 것은, 프로그램을 바로 실행시켰을때, script file에서 __name__은 __main__을 가지고 있고, __name__ == "main"인 것을 알 수 있다.
여기서 다음을 추가해보겠다:
#2-1 second.py
import first
>>> python second.py
>>>
여기서 뭔가 이상하다. 원래 다른 module을 import하면 그 module이 한번 실행되는 것으로 알고 있다. 따라서 import first를 했기 때문에 first의 코드가 실행이 되어야하는데, 아무것도 출력되지 않았다. 심지어 여기에 __name__=="__main__"일 경우에 따른 경우에도 출력해야 될 것을 정해놨기 때문에 출력이 나와야 하는것 아닌가?
여기서 이제 알아야 할 점은, second.py에서 first.py를 불러올때 __name__=="__main__"가 아니라는 점이다. 여기서 실제로 __name__은 다른 값을 출력하게 된다. 다음과 같이 first.py를 바꾸어주고 실행시켜준다
#1-2 first.py
class addition:
def __init__(self, a, b):
self.a = a
self.b =b
def add(self):
result = self.a + self.b
return result
if __name__=="__main__":
print(addition(1,2).add())
print(__name__)
else:
print(__name__)
>>> python second.py
first
이제는 first라는 값만 출력되는 것을 볼 수 있다. 그런데 왜 1-2 first.py와는 다르게 first라는 값이 출력되는 것인가? 그것은 second.py에서 first를 import 해와서 이제는 __main__은 second.py의 __name__에 적용되기 때문이다. 즉, first.py가 이제는 main program이 아닌 상태로 실행되기 때문에 else문을 넣고 print(__name__)을 하면 first라는 script file의 이름이 출력되는 것이다
#2-2 second.py
import first
print(__name__)
>>> python second.py
first
__main__
실제로 second.py를 실행해보면 first와 __main__을 출력하는 것을 볼 수 있다. first를 import 했기에 first를 먼저 실행시켜주고, second.py에 있는 코드를 실행시키는 것이다.
만약 first.py에 있는 class addition을 불러오고 싶으면 다음과 같이 하여 출력할 수 있다:
#2-3 second.py
import first
print(__name__)
print(first.addition(1,2).add())
>>> python second.py
first
__main__
3
first.addition(1,2).add()를 통해 first module의 addition class의 add function을 불러오는 것이다.
※ 결론
methods의 극히 일부분인 __name__, __init__, 그리고 __main__을 다루어보았다. 정리를 하자면 다음과 같다:
if __name__=="__main__"처럼 __name__의 값이 "__main__"인지 확인하는 코드는, 현재 script file이 프로그램의 시작점이 맞는지 판단하는 것이다. 즉, script file이 main program으로 사용될 때와 module(import ... )로 사용될 때를 구분하기 위한 용도이다.
이제는 이에 대한 혼동이 없어야 한다...!
'Python 공부하기' 카테고리의 다른 글
zip 내장 함수에 대하여 (0) | 2020.11.27 |
---|---|
isdecimal(), isdigit(), isnumeric()에 대하여 (0) | 2020.11.25 |
Enumerate 함수에 대하여 (0) | 2020.11.25 |
Regex(Regular Expression)에 대하여 (0) | 2020.11.15 |
super - 기반 class / 상속자(Constructor) / *args, **kwargs 알아보기 (2) | 2020.11.08 |