함수는 1급 객체이다
정수나 문자열은 1급 객체(first-class object)이다. 따라서 변수, 매개변수, 반환값 등에 정의해서 사용할 수 있다. 함수 또한 1급 객체로 다른 객체와 같은 방식으로 사용할 수 있다.
직접 함수를 정의해서 예를 들어보자.
def func(x, y):
return x + y
var = func
var is func # 두 변수는 같은 함수를 참조하므로 레퍼런스가 같다.
[결과]
True
def func(x, y):
return x + y
func = 10 # 함수가 정의된 func 변수에 숫자를 할당하면 기존 함수 객체가 사라진다.
func
[결과]
10
이 상태에서 만약 func에 인자를 주면 오류가 난다.
def func(x, y):
return x + y
func = 10
func(10, 20)
[결과]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
c:\Users\reo91\OneDrive\Coding Practice\P C++, Python\Python3.ipynb 셀 13 in <cell line: 6>()
4 func = 10
5 func
----> 6 func(10, 20)
TypeError: 'int' object is not callable
위를 통해 함수 이름도 결국 변수 취급되는 것을 알 수 있다. 그렇다면 미리 var = func를 작업했으니 var에 대해 알아보자.
var.__name__
[결과]
func
__name__속성을 조회하니 정의했던 함수 이름인 func가 출력되는 것을 볼 수 있다. 이 var 변수로 함수 역할을 수행할 수 있다.
var(10, 20)
[결과]
30
함수도 이름으로 접근해서 호출
함수 클래스도 디스크립터 클래스이다. 디스크립터 클래스로 객체를 만들어 변수에 할당해 실제 이름으로 접근하면 내부적으로 메소드가 자동 실행된다.
함수 add를 만들어보자. 그리고 함수 내부 메소드인 __get__을 참조해 내부에 정의된 메소드 객체를 조회할 수 있다.
디스크립터 클래스에는 반드시 정의해야 하는 스페셜 메소드 __get__이 정의되어 있어 함수의 이름으로 조회하면 함수 객체를 자동으로 가져오기 위해 이 __get__메소드가 자동으로 실행된다.
def add(x, y):
return x + y
add.__get__
[결과]
<method-wrapper '__get__' of function object at 0x000001E10DD13C70> # C언어로 작성됨
이 스페셜 메소드 __get__이 어떻게 작동하는지 알아보자. 함수에 인자로 1을 넣고 이를 변수 b에 할당한 후 인자 2를 전달하면 두 수를 더한 값이 출력된다.
b = add.__get__(1)
b(2)
[결과]
3
이번에는 __get__에 None을 전달해보자. None을 전달하면 함수가 호출된다. 보통 함수가 저장된 변수를 참조하면 이 기능이 작동되고 두 번째 인자부터는 함수를 가져오는데 아무런 역할을 하지 않는 것을 볼 수 있다.
def add(x, y):
return x + y
b = add.__get__(None, add)
b(1, 2)
b = add.__get__(None, 31342)
b(1, 2)
[결과]
3
3
참고
- 한권으로 개발자가 원하던 파이썬 심화 A to Z, 문용준/문성혁 저
'◎ Python > 파이썬 심화 (책)' 카테고리의 다른 글
[파이썬 심화] 13. 클래스 정의하기 (1) | 2022.09.06 |
---|---|
[파이썬 심화] 12. 함수에 여러 가지 종류의 매개변수를 설정할 수 있다! (1) | 2022.09.05 |
[파이썬 심화] 10. 여러 조건에 따라 기능 선택하기 (0) | 2022.09.01 |
[파이썬 심화] 9. 여러 문장을 묶어 반복 실행하기 (0) | 2022.08.31 |
[파이썬 심화] 8. 조건 판단에 따른 문장 선택하기 (0) | 2022.08.30 |
자기계발 블로그