티스토리 뷰

개발용 정리

[python] decorator 정리

공부하는묵 2025. 8. 13. 17:28

Closure (클로저)

내부 함수가 외부 함수의 변수를 참조할 수 있는 특성

 

내부 함수가 외부 함수의 지역 변수를 기억하고 사용할 수 있다. 

 

def outer():
	x = 10 # 외부 함수의 변수
    
    def inner():
    	print(x) # 내부 함수에서 외부 함수의 변수에 접근  	
    
    return inner # 내부 함수 반환


# 내부 함수인 inner 반환
closure = outer()

# inner() 가 실행
# x = 10은 outer 함수에서 정의됐지만, 내부 함수인 inner 함수에서도 접근 가능
# 10 출력
closure()

 

 

Decorator (데코레이터)

함수를 인자로 받아서 새로운 함수로 반환하면서, 기존 함수를 수정하거나 확장하는 방법

 

클로저를 활용하여 구현됨

 

  • 기존 함수의 코드를 직접 수정하지 않고 새로운 기능 추가 가능 (함수의 시간 측정 기능)
  • @를 사용하여 함수 정의 위에 적용
  • 함수를 인수로 받아서 새로운 함수를 반환하는 형태
import time

def timer(func):    # func 매개변수를 통해 함수를 받아옴
	def wrapper(*args, **kwargs):
    	start = time.time()
        """
        func -> slow_function이 들어간다. 
        *args, **kwargs를 이용하여 원래 함수의 인자를 동적으로 받을수 있다.
        """
        result = func(*args, **kwargs)   
        end = time.time()
        print(f"실행 시간: {end - start:.4f}초")
        return result

	return wrapper
    
    
@timer    # @를 통해 데코레이터 사용할 것을 표기
def slow_function():
	time.sleep(2)
    print("작업 완료")
    
slow_function()

 

 

functools.wraps

 

데코레이터 사용 시, 원래 함수의 이름과 설명이 사라지기 때문에 원본 함수의 이름, 설명, 속성을 유지하기 위해서 사용

 

import functools

def decorator(func):
	@functools.wraps(func)    # 원래 함수 정보를 유지
    def wrapper():
    """ 이것은 래퍼 함수입니다. """
    	return func()
    return wrapper

@decorator
def say_hello():
	"""이 함수는 인사를 합니다. """
    print("안녕하세요!")

print(say_hello.__name__) # say_hello
print(say_hello.__doc__) # "이 함수는 인사를 합니다."

'개발용 정리' 카테고리의 다른 글

[Vue.js] 디렉티브(Directives)  (0) 2025.08.22
[DBMS] 데이터 join 이해하기  (7) 2025.08.06
[JavaScript] 호이스팅  (2) 2025.07.28
[JavaScript] 변수 선언 var, let, const 정리  (4) 2025.07.24
[CSS] 선택자  (0) 2025.07.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함