본문 바로가기
코딩/파이썬

클로저와 데코레이터

by Song1234 2024. 3. 19.

5.클로저

클로저(Closure)는 프로그래밍 언어에서 중요한 개념 중 하나로, 함수와 그 함수가 참조하는 외부 변수(또는 자유 변수) 사이의 관계를 나타냅니다. 클로저는 함수의 내부에서 정의된 함수로, 내부 함수가 외부 함수의 변수에 접근할 수 있고, 외부 함수는 내부 함수를 반환할 수 있습니다. 이로 인해 함수와 그 함수가 참조하는 상태(변수)를 함께 저장하고 유지할 수 있습니다.

일반적인 함수 및 클래스 사용

def mul2(n):
    return n * 2
def mul5(n):
    return n * 5
print(mul5(10))
print(mul5(5))
class Mul:
    def __init__(self, m):
        self.m = m

    def mul(self, n):
        return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
class Mul:
    def __init__(self, m):
        print('생성자 호출')
        self.m = m

    def __call__(self, n): #call 함수
        print('call 호출')
        return self.m * n
mul2 = Mul(2)
print(mul2(10)) # 실행
print(mul2(5))# 실행
생성자 호출
call 호출
20
call 호출
10

객체를 함수처럼 사용하면 스페셜메서드 call 이 호출된다.


클로저 사용

# 클로저 사용하기
def mul(m): # wrapper를 가리키는 함수가된다.
    def wrapper(n):
        return m * n
    return wrapper
'''
    def wrapper(n):
        return m * n
'''
mul2 = mul(2) # 입력한 값에 2를 곱해주는 함수
print(mul2(10))

20

mul5 = mul(5)
print(mul5(10))

50


6. 데코레이터

데코레이터(Decorator)는 파이썬에서 함수나 메서드의 동작을 수정하거나 확장하기 위한 강력한 도구입니다. 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하며, 코드 재사용성과 가독성을 향상시킵니다. 데코레이터는 @ 기호를 사용하여 함수나 메서드 위에 적용됩니다.

import time # 시간에 관련한 함수들이 있는 모듈
def func1(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = a + b

    end = time.time()
    print(f'함수 수행시간: {end - start}')
    return result
result = func1(10, 3)
print(result)

함수가 시작되었습니다
함수 수행시간: 0.0005486011505126953
13

def func2(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = a * b

    end = time.time()
    print(f'함수 수행시간: {end - start}') # 함수의 시작시간 - 끝난시간 을 계산해  수행하는데 걸린 시간을 출력
    return result
result = func2(10, 3)
print(result)

함수가 시작되었습니다
함수 수행시간: 0.0008609294891357422
30


데코레이터 사용

# 데코레이터 만들기
def func1(a, b):
    result = a + b
    return result

def func2(a, b):
    result = a * b
    return result
def elapsed(func): # func함수를 넣어준다  
def wrapper(a,b): # 매개변수에 값을 받아준다  
start = time.time()  
print('함수가 시작되었습니다')
    result = func(a, b) # 불러온 함수를 받아온 값 에 적용시켜 계산

    end = time.time()
    print(f'함수 수행시간: {end - start}')
    return result
return wrapper

deco1 = elapsed(func1)  
result = deco1(10, 3)  
print(result)

함수가 시작되었습니다
함수 수행시간: 0.0015273094177246094
13


@elapsed # 데코레이터 사용  
def func1(a, b):  
result = a + b  
return result

@elapsed  
def func2(a, b):  
result = a \* b  
return result

@elapsed  
def func3(a, b):  
result = a - b  
return result

result = func2(10, 3)  
print(result)

함수가 시작되었습니다
함수 수행시간: 0.0008814334869384766
30

'코딩 > 파이썬' 카테고리의 다른 글

스페셜 메서드  (0) 2024.03.19
파이썬 상속  (0) 2024.03.19
파이썬 - 객체지향과 클래스  (3) 2024.03.18
파이썬 - 콜백함수와 람다함수  (1) 2024.03.18
파이썬 - 변수의 범위  (0) 2024.03.18