본문 바로가기

Python

23. 클로저와 데코레이터

1. 클로저(Closure)

  • 함수 안의 함수를 결과로 반환할 때, 그 내부 함수를 클로저라고 함
  • 콜백함수, 함수의 순차적 실행, 데코레이터 함수에 사용
def mul2(n):
  return n * 2  
  
mul2(10) # 20
mul2(5) # 10

def mul5(n):
  return n * 5

mul5(10) # 50
mul5(5) # 25
# mul1, mul2, mul3 ... mul100도 만들어야 하나?

# 클래스 이용하기
class Mul:
  def __init__(self, m):
    self.m = m
  def mul(self, n):
    return self.m * n
    
mul2 = Mul(2)
print(mul2.mul(10)) # 20
print(mul2.mul(5)) # 10

mul5 = Mul(5)

print(mul5.mul(10)) # 50
print(mul5.mul(5)) # 25
class Mul:
  def __init__(self, m): # 객체를 생성할 때 자동으로 호출
    print('생성자 호출')
    self.m = m

  # __call__ 머신러닝, 딥러닝에서 많이 사용
  def __call__(self, n): # 객체를 실행할 때 자동으로 호출
    print('call 호출')
    return self.m * n
    
mul2 = Mul(2) # 생성자 호출
mul2(2) 
'''
call 호출
4
'''

mul5 = Mul(5) # 생성자 호출
mul5(10)
'''
call 호출
50
'''
# 클로저 사용하기

def mul(m):       # 외부 함수
  def wrapper(n): # 내부 함수(클로저)
    return m * n
  return wrapper

mul2 = mul(2) # m = 2 인 wrapper 함수가 mul2에 저장
print(mul2(10)) # m = 2, n = 10인 wrapper 함수가 실행
# 20

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

2. 데코레이터(Decorator)

  • 함수를 꾸며주는 함수
  • 함수를 인수로 받는 클로저
  • @(어노테이션)를 이용하여 사용
  • 반복되는 작업을 여러 함수에 적용할 경우, 기존 함수를 수정하지 않고 추가 기능을 구현하고 싶은 경우
import time # 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)
'''
함수가 시작되었습니다
함수 수행시간 : 7.224082946777344e-05
'''
print(result) # 13

print(format(7.224082946777344e-05, 'f')) # 0.000072
def func2(a, b):
  start = time.time()
  print('함수가 시작되었습니다')

  result = a * b

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

  return result
  
result = func2(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 0.0015358924865722656
'''
print(result) # 30
# 데코레이터 만들기
def elapsed(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)
'''
함수가 시작되었습니다
함수 수행시간 : 0.0005011558532714844
'''
print(result) # 13

deco2 = elapsed(func2)
result = deco2(10, 3)
'''
함수가 시작되었습니다
함수 수행시간 : 9.250640869140625e-05
'''
print(result) # 30

@elapsed
def func1(a, b):
  result = a + b
  return result

@elapsed
def func2(a, b):
  result = a * b
  return result
  
result = func1(10,3)
'''
함수가 시작되었습니다
함수 수행시간 : 0.00012969970703125
'''
print(result) # 13

result = func2(10,3)
'''
함수가 시작되었습니다
함수 수행시간 : 6.842613220214844e-05
'''
print(result) # 30

'Python' 카테고리의 다른 글

주피터 노트북 설치  (0) 2023.03.14
24. 변수 타입 어노테이션  (0) 2023.03.14
22. 파일 입출력  (0) 2023.03.14
21. 예외 처리  (0) 2023.03.13
20. 모듈  (0) 2023.03.13