파이썬의 class와 self¶
In [1]:
class MyTest:
def hello():
print("MyTest hello method")
파이썬에서 class 내장 메서드를 만들 때는 첫 파라미터로 self를 써 줘야 한다.
그런데 위처럼 self를 쓰지 않아도 오류 메시지가 뜨지 않는다.
In [3]:
obj = MyTest()
obj.hello()
하지만 인스턴스를 정의하고 메서드를 사용하려고 하면 에러가 뜬다.
에러 구문을 보면 하나의 parameter가 전달되었는데, 그걸 받는 argument가 없어서 생긴 에러이다.
분명히 넘겨주지 않았는데도 이런 에러가 뜬다.
이는 파이썬에서 클래스의 내장 메서드를 부를 때 첫 인자로 인스턴스를 넘겨주기 때문이다.
실제로 다음과 같이 함수를 조금 바꾸고 출력해보자.
id는 객체가 저장되어 있는 주소값을 출력하는 함수이다.
In [8]:
class MyTest:
def hello(self):
print(id(self))
print("MyTest hello method")
In [9]:
obj = MyTest()
obj.hello()
self argument를 추가해주니 error가 사라진다.
In [11]:
id(obj)
Out[11]:
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()
Out[13]:
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()
Out[15]:
가능은 하다.
그러나 self로 넘겨주는 것이 관례상의 용법인 듯하다.
참고
'language' 카테고리의 다른 글
데이터의 입력과 출력 (0) | 2019.09.24 |
---|---|
파이썬과 private attribute (0) | 2019.09.21 |
파이썬을 파이썬답게 (0) | 2019.09.16 |
파이썬 언어의 특징, 연산자 오버로딩, 할당, 자료형1 (0) | 2019.09.11 |
정렬 - list.sort(), sorted() (0) | 2019.09.06 |