본문으로 바로가기

파이썬의 class와 self

category language 2019. 9. 21. 21:33

파이썬의 class와 self

In [1]:
class MyTest:
    def hello():
        print("MyTest hello method")

파이썬에서 class 내장 메서드를 만들 때는 첫 파라미터로 self를 써 줘야 한다.
그런데 위처럼 self를 쓰지 않아도 오류 메시지가 뜨지 않는다.

In [3]:
obj = MyTest()

obj.hello()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-d9d34e58be7e> in <module>
      1 obj = MyTest()
      2 
----> 3 obj.hello()

TypeError: hello() takes 0 positional arguments but 1 was given

하지만 인스턴스를 정의하고 메서드를 사용하려고 하면 에러가 뜬다.
에러 구문을 보면 하나의 parameter가 전달되었는데, 그걸 받는 argument가 없어서 생긴 에러이다.
분명히 넘겨주지 않았는데도 이런 에러가 뜬다.

이는 파이썬에서 클래스의 내장 메서드를 부를 때 첫 인자로 인스턴스를 넘겨주기 때문이다.
실제로 다음과 같이 함수를 조금 바꾸고 출력해보자.
id는 객체가 저장되어 있는 주소값을 출력하는 함수이다.

In [8]:
class MyTest:
    def hello(self):
        print(id(self))
        print("MyTest hello method")
In [9]:
obj = MyTest()

obj.hello()
4400022696
MyTest hello method

self argument를 추가해주니 error가 사라진다.

In [11]:
id(obj)
Out[11]:
4400022696

MyTest의 인스턴스 obj와 저장된 주소값이 같다.
좀더 확실히 비교해보자.

In [12]:
class MyTest:
    def hello(self):
        print(id(self))
        print("MyTest hello method")
        return self
In [13]:
obj = MyTest()

obj is obj.hello()
4399401784
MyTest hello method
Out[13]:
True

self로 넘어간 (명시적으로 넘겨주지 않았지만 내부적으로 자동으로 넘어간) 무언가와, obj는 같다!

그럼 여기서 하나 궁금해지는 것이 있다.
꼭 인스턴스를 self로 넘겨줘야 하는 걸까?
자바처럼 this를 사용하면 어떨까?

In [14]:
class MyTest:
    def hello(this):
        print(id(this))
        print("MyTest hello method")
        return this
In [15]:
obj = MyTest()

obj is obj.hello()
4400022696
MyTest hello method
Out[15]:
True

가능은 하다.
그러나 self로 넘겨주는 것이 관례상의 용법인 듯하다.

temp



참고

https://wikidocs.net/1742