더북(TheBook)

객체 g의 메서드는 함수가 아니라 메서드인 것을 알 수 있습니다. 둘의 차이는 무엇일까요?

>>> dir(g.give_money)              #1

['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> g.give_money.__func__  #2

<function Person.give_money at 0x035951E0>

>>> g.give_money.__self__    #3

<__main__.Person object at 0x02C40C10>

>>> g.give_money.__func__ is Person.give_money #4

True

>>> g.give_money.__self__ is g    #5

True


객체 g가 가진 give_money() 메서드의 속성(attribute)을 확인합니다(#1). 쭉 둘러보니 __func____self__가 보입니다. 다시 __func__를 확인해 보면(#2) Person 클래스의 give_money() 함수라고 나옵니다.

__self__를 확인해 보면(#3) Person 객체라고 나옵니다. 또한 __func__Person 클래스의 give_money() 함수라는 것을 확인할 수 있고(#4), __self__가 이 메서드를 가진 객체 자신을 참조하고 있다는 것도 확인할 수 있습니다(#5).

이로써 객체에서 메서드를 호출할 때 맨 처음 인자인 self를 전달하지 않아도 되는 이유를 알 수 있습니다. 메서드 내부에 함수와 객체의 참조를 가지고 있으므로 함수에 직접 객체의 참조를 전달할 수 있기 때문입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.