Python:클로저, 데코레이터 실행순서

Psj·2020년 10월 26일
0

Python

목록 보기
10/41

클로저 실행순서

1 def generate_power(base_number):
2    def nth_power(power):
3        return base_number ** power
4
5    return nth_power
6
7
8 calculate_power_of_two = generate_power(2)
9 calculate_power_of_two(7)

함수 실행라인 순서
1->8->1->2->5->9->2->3

코드가 위에서 아래로 내려오니 1번라인의 generate_power(base_number)가 시작되고
인자를 받기위해 8번라인 generate_power(2)에서 인자를 받는다.

그러면 아래와같은 상태가된다.

1 def generate_power(2):
2    def nth_power(power):
3        return 2 ** power
4
5    return nth_power
6
7
8 calculate_power_of_two = generate_power(2)
9 calculate_power_of_two(7)

def generate_power(2) 함수가 실행됐지만 내부의 def nth_power(power)는 받을 인자가 없어 실행되지 않고
아래로 내려와 def generate_power(2)의 return nth_power가 되어 아래코드의 함수를 호출하는 상태가 된다.

def nth_power(power):
3        return 2 ** power

이 상태가 8번라인의 generate_power(2)가 할당된 calculate_power_of_two 안에 들어가고
9번라인의 인자 7이 할당되어

9 calculate_power_of_two(7)

2번라인 def nth_power(power)함수에 들어가 아래와같이 되고 최종적으로 2 ** 7 즉, 2의 7승인 128이 리턴된다.

2    def nth_power(7):
3        return 2 ** 7

데코레이터 실행순서

1) 데코레이터 실행

1 def welcome_decorator(func):
3  
4 	def wrapper():
5    
6 		return func()+"welcome to WECODE!"
7    
8 	return wrapper 
9
10 @welcome_decorator
11 def greeting():
12 	return "Hello, "
13
14 greeting()

2) 클로저로 실행

1 def welcome_decorator(func):
3  
4 	def wrapper():
5    
6 		return func()+"welcome to WECODE!"
7    
8 	return wrapper 
9
10 
11 def greeting():
12 	return "Hello, "
13
14 deco=welcome_decorator(greeting)   -- 클로저로표현방법
15 deco()                             --

1)과 2)는 실행결과가 "Hello, welcome to WECODE!"로 결과가 일치한다.
클로저로 실행할것을 데코레이터로 실행하면 더 간단하기때문에 데코레이터를 사용한다.
이제 데코레이터 실행순서를 알아보겠다

데코레이터 실행순서

1 def welcome_decorator(func):
3  
4 	def wrapper():
5    
6 		return func()+"welcome to WECODE!"
7    
8 	return wrapper 
9
10 @welcome_decorator
11 def greeting():
12 	return "Hello, "
13
14 greeting()

현재 14번 라인에 greeting()을 선언했으므로 greeting()이 실행되어야하는데 11번라인 def greeting() 바로윗줄에
@welcome_decorator 이렇게 @로 1번라인 함수를 데코레이터 해준것을 볼수 있다.

이럴경우 선언은 greeting()을 했지만 def greeting() 윗줄의 @welcome_decorator 함수인 def welcome_decorator(func)가 먼저 실행이 된다.

14번라인의 greeting()은 아래코드를 함축한것으로 이해하면된다.

deco=welcome_decorator(greeting)   -- 클로저로표현방법
deco()                

그러면 결과는 "Hello, welcome to WECODE!"로 나오게 된다.

profile
Software Developer

0개의 댓글