함수는 파이썬에서 호출 가능한 객체입니다. 즉, 호출 연산자를 사용하여 호출할 수 있습니다. 그러나 다른 객체도 __call__method를 구현하여 함수를 에뮬레이트할 수 있습니다.
예시
def a(): pass # a() is an example of function print a print type(a)
출력
C:/Users/TutorialsPoint/~.py <function a at 0x0000000005765C18> <type 'function'>
메소드는 바인딩되거나 바인딩 해제될 수 있는 특수한 함수 클래스입니다.
예시
class C: def c(self): pass print C.c # example of unbound method print type(C.c) print C().c # example of bound method print type(C().c) print C.c()
물론 바인딩되지 않은 메서드는 인수로 전달하지 않고 호출할 수 없습니다.
출력
<function a at 0xb741b5a4> <type 'function'> <unbound method C.c> <type 'instancemethod'> <bound method C.c of <__main__.C instance at 0xb71ade0c>> <type 'instancemethod'> Traceback (most recent call last): File "~.py", line 11, in <module> print C.c() TypeError: unbound method c() must be called with C instance as first argument (got nothing instead)
Python에서는 바인딩된 메서드, 함수 또는 호출 가능한 개체(__call__ 메서드를 구현하는 개체) 또는 클래스 생성자 간에 큰 차이가 없습니다. 그것들은 모두 똑같이 생겼고, 단지 다른 명명 규칙이 있을 뿐이며 내부적으로는 크게 다를 수 있습니다.
이것은 바인딩된 메서드를 함수로 사용할 수 있음을 의미합니다. 이것은 Python을 매우 강력하게 만드는 많은 작은 것들 중 하나입니다.
>>> d = A().a #this is a bound method of A() >>> d() # this is a function
또한 len(...)과 str(...) 사이에 근본적인 차이가 있음에도 불구하고(str은 유형 생성자임) 조금 더 깊이 들어갈 때까지 차이점을 알아차리지 못할 것입니다.
>>>len <built-in function len> >>> str <type 'str'>