[python][TIL] self의 의미

5118 단어 pythonpython

python과 class

 파이썬을 주로 스크립트를 작성하는데 사용했었다. 하지만 Django를 사용하게 되면서 python에서 class를 다룰 일이 많아졌는데, 필요한 부분을 그때그때 찾아서 공부하였기 때문에 몇몇 헷갈리는 부분이 있었다. 그 중 가장 애매했던 부분이 self라는 키워드였다.

this와 비슷한데 또 다른거 같기도 하고..

 self라는 키워드를 처음 접하고 검색하며 공부해봤을 때 알게된 것은 본인의 인스턴스를 가리키는 변수라는 것이다. 자바의 this와 같다고 생각했다. 쓰이는 방법은 확실히 같은것 같다. 하지만 뭔가 이상했다. 메소드의 인자로 self가 쓰이는 것이다.
예를들어

class Foo:
        
    def print_value(self):
    	print("print_value")

foo = Foo("new")
foo.print_value()

이런식으로 말이다. 찾아보니, 파이썬에서 클래스 내의 메소드에는 무조건
첫 인자로 self를 갖는다고 한다. 뭐 그렇게 만들었다면 그런거지 하면서 "오케이"하며 받아들이고 넘어가려는데 클래스 내에 있으면서도 self를 갖지 않는 경우를 발견하였다.(...!)

class Foo:

    def print_value1():
    	print("print_value1")
        
    def print_value1(self):
    	print("print_value2")

이렇게 클래스를 작성하는 경우 클래스 작성 단계에서 에러가 발생하진 않는다. 하지만 메소드를 호출해보면 print_value1를 호출할 때 에러가 발생한다.

>>> foo = Foo()
>>> foo.print_value1()
Traceback (most recent call last):
 File "<pyshell#31>", line 1, in <module>
   foo.print_value1()
TypeError: print_value1() takes 0 positional arguments but 1 was given
>>> foo.print_value2()
print_value2
>>> 

 재밌는 점은 인스턴스가 아닌 클래스 수준에서 호출을 하면 에러가 발생하지 않는다는 것이다.

>>> Foo.print_value1()
print_value1
>>>

 이 말은 객체를 생성하지 않고도 메소드를 호출할 수 있다는 것, 즉 self를 인자로 갖지 않으면 객체를 만들지 않고도 호출할 수 있는 "정적 메소드"라는 것이다." 자바와 다르게 정적 메소드를 함수를 선언할 때 지정자로 구분을 하는 것이 아니라 self를 인자로 갖는지로 구분을 하는 방식이어서 포인트를 찾기 어려웠던 것 같다. 또 하나의 차이점이 있는데 자바에서는 인스턴스에서도 정적 메소드를 호출할 수 있다. 하지만 배울 때 정적 메소드는 클래스 수준에서 호출하는 것이 바람직하다고 배웠다.(코드에서 더 직관적으로 정적 메소드를 구분하기 위해) 내 생각에 파이썬에서는 그에 대한 제약을 더 강화한 것 같다.

 결론 : 파이썬에서는 self라는 키워드를 통해 자신의 인스턴스에 접근할 수 있으며 self가 메소드의 매개변수로 사용되냐의 유무는 해당 메소드가 정적 메소드인지 일반 메소드인지 구분하는데 사용된다.

좋은 웹페이지 즐겨찾기