<함수의 객체 성질을 보여주는 코드>
def func():
return 1
print(func())
print(func)
<함수안에 함수 구조의 코드>
def hello(name='Ray Kim'):
print('The hello() function has been executed')
def greet():
return '\t This is the greet() func inside hello'
def welcome():
return '\t This is welcome() inside hello'
if name == 'Ray Kim':
return greet
else:
return welcome
my_new_func = hello('Ray Kim')
<상위 함수를 그냥 지나치는 함수 코드>
def cool():
def super_cool():
return ' I am very cool!'
return super_cool
some_func = cool()
some_func #cool()
<함수A가 동일 선상에서 정의된 다른 함수B를 인자값으로 쓰는 코드>
def hey():
return 'Hey Ray!'
def other(some_def_func):
print('Other code runs here!')
print(some_def_func())
print(id(hey))
print(id(other))
hey()
other(hey)
=> 위 코드는 함수A가 다른 함수B의 인자값으로 들어가 함수B의 명령을 행하며 본래 자기 자신 내에 코드를 실행하는 법을 보여준다.
=> 위 출력 과정을 자세히 살펴보면... aaa
(1) 'other(hey)' 실행시, 먼저 정의된 hey()함수가 other()함수의 인자값으로 들어가고,
(2) other()함수의 첫번째 내부 명령인 'other code runs here!'을 출력한 후,
(3) 두번째 내부 명령인 print(some_def_func())함수에 인자값으로 들어가게 되어 print(hey()) 로 변환된 함수를 수행하며 "hey ray!"를 출력하게됨.
<전후를 감싸는(wrap)기능 함수 + @ decorator 기능이 사용된 코드>
def new_decorator(original_func):
def wrap_func():
print('Some extra code, before the original function')
original_func()
print('some extra code, after the original function!')
return wrap_func
def func_needs_decorator1():
print("I want to be decorated!")
func_needs_decorator1()
decorated_func = new_decorator(func_needs_decorator1)
decorated_func()
@new_decorator
def func_needs_decorator2():
print("I want to be decorated!")
func_needs_decorator2()
a. Wrap 함수 개념 설명: 위 코드 예제는 "wrap_func()" 함수를 활용해 원하는 출력물의 전후를 감싸는 모양의 다음과 같은 출력물이 나온다:
["Some extra code, before the original function!"
"I want to be decorated!"
"some extra code, after the original function!"]
==> new_decorator() 함수의 인자값으로 포장 함수의 내부 내용물이 될 실행할 함수 func_needs_decorator1()를 넣은 후, wrap_func() 포장 함수 출력문('Some extra code...이하 생략')이 앞뒤로 출력된다.