Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 함수와 Python 객체 메서드 중 어느 것이 더 근본적인가요?

<시간/>

함수는 파이썬에서 호출 가능한 객체입니다. 즉, 호출 연산자를 사용하여 호출할 수 있습니다. 그러나 다른 객체도 __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'>