출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

이번 포스팅에는 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
>>>

여기서 뭔가 이상하다. 원래 다른 moduleimport하면 그 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에서 firstimport 해와서 이제는 __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__을 출력하는 것을 볼 수 있다. firstimport 했기에 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 moduleaddition classadd function을 불러오는 것이다.

 

 

※ 결론

methods의 극히 일부분인 __name__, __init__, 그리고 __main__을 다루어보았다. 정리를 하자면 다음과 같다:

 

if __name__=="__main__"처럼 __name__의 값이 "__main__"인지 확인하는 코드는, 현재 script file이 프로그램의 시작점이 맞는지 판단하는 것이다. 즉, script filemain program으로 사용될 때와 module(import ... )로 사용될 때를 구분하기 위한 용도이다.

 

이제는 이에 대한 혼동이 없어야 한다...!