클래스 내의 메서드를 생성할 때, 인자로 항상 self를 가지고 있어야한다.
이 self에 대해 알아보자.
>>> class Foo:
def func1():
print("function 1")
def func2(self):
print("function 2")
위에 처럼 클래스 Foo에 대해 정의 했을 때 self인자를 전달하지 않아도(func1의 경우) 클래스 정의에 오류가 발생하지 않는 것을 알 수 있다.
>>> f = Foo()
>>> f.func1()
Traceback (most recent call last):
File "<pyshell#94>", line 1, in <module>
f.func1()
TypeError: func1() takes 0 positional arguments but 1 was given
>>> f.func2()
function 2
하지만 인스턴스를 생성하고 사용시에 self를 인자를 갖고있는(func2) 메서드는 사용가능한 반면 갖고 있지 않은(func2) 메서드는 에러가 뜨는 것을 확인할 수 있다.
그 내용을 들여다보면 “func1메서드가 인자를 받지 않고 있는데 1개의 인자가 주어져서 생긴 에러”임을 알 수 있다.
그렇다면 주어지는 인자는 무엇일까? 코드로 알아보자.
>>> class Foo:
def func1():
print("function 1")
def func2(self):
print(id(self))
print("function 2")
>>> f = Foo()
>>> id(f)
68304528
>>> f.func2()
68304528
function 2
위 코드를 통해 self의 정체가 인스턴스 객체 그 자체라는 것을 알 수 있다. 따라서 이 self를 통해 인스턴스 멤버에 접근할 수 있으며 인스턴스 메서드의 첫번째 인자에 자동으로 바인딩 된다는 것을 알 수 있다.