객체 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를 전달하지 않아도 되는 이유를 알 수 있습니다. 메서드 내부에 함수와 객체의 참조를 가지고 있으므로 함수에 직접 객체의 참조를 전달할 수 있기 때문입니다.