FRONTMANFRONTMAN
  • 태그
  • 방명록
  • 글쓰기
  • 관리자
  • HOME
  • 태그
  • 방명록
Python 데코레이터 (Decorators)
hahekaku
Python 데코레이터 (Decorators)Language/Python2023. 10. 28. 12:58@hahekaku
Table of Contents

데코레이터(decorators)는 Python에서 함수나 메서드의 동작을 수정하거나 확장할 수 있는 강력한 기능입니다. 이 글에서는 데코레이터의 개념, 기본적인 사용법, 다양한 예제를 통해 실용적인 사용법을 설명하겠습니다.

데코레이터란 무엇인가?

Python의 데코레이터는 다른 함수를 감싸는 함수입니다. 주로, 기존 함수에 새로운 기능을 추가하거나, 동작을 변경하고 싶을 때 사용됩니다. Python에서 데코레이터는 @ 기호를 사용하여 정의합니다.

기본 구조

데코레이터는 보통 다음과 같은 구조를 가집니다:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        print(f"{original_function.__name__} 함수가 호출되기 전")
        result = original_function(*args, **kwargs)
        print(f"{original_function.__name__} 함수가 호출된 후")
        return result
    return wrapper_function

데코레이터 적용

@decorator_function을 사용하여 기존 함수에 데코레이터를 적용할 수 있습니다:

@decorator_function
def say_hello(name):
    print(f"안녕하세요, {name}님!")

say_hello("철수")

출력 결과는 다음과 같습니다:

say_hello 함수가 호출되기 전
안녕하세요, 철수님!
say_hello 함수가 호출된 후

데코레이터의 실제 사용 예제

1. 실행 시간 측정

데코레이터를 사용하여 함수의 실행 시간을 측정할 수 있습니다.

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 실행 시간: {end_time - start_time:.2f}초")
        return result
    return wrapper

@timer_decorator
def calculate_sum(numbers):
    return sum(numbers)

numbers = range(1, 1000000)
calculate_sum(numbers)

2. 접근 제어

예를 들어, 인증이 필요한 함수를 만들 때 유용합니다.

def authentication_required(func):
    def wrapper(user_authenticated, *args, **kwargs):
        if not user_authenticated:
            print("접근 권한이 없습니다!")
            return
        return func(*args, **kwargs)
    return wrapper

@authentication_required
def view_sensitive_data(user_authenticated, data):
    print(f"민감한 데이터: {data}")

# 인증된 사용자
view_sensitive_data(True, "기밀 문서")

# 인증되지 않은 사용자
view_sensitive_data(False, "기밀 문서")

3. 로깅 데코레이터

데코레이터를 이용해 함수 호출을 기록(log)할 수 있습니다.

def logging_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"'{func.__name__}' 함수가 호출되었습니다. 인자: {args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@logging_decorator
def add(a, b):
    return a + b

result = add(5, 3)
print(f"결과: {result}")

출력:

'add' 함수가 호출되었습니다. 인자: (5, 3), {}
결과: 8

클래스 데코레이터

데코레이터는 클래스에도 적용할 수 있습니다.

1. 클래스 메서드 로깅

클래스의 모든 메서드를 감싸는 데코레이터를 사용할 수 있습니다.

def method_logger(cls):
    class WrappedClass:
        def __init__(self, *args, **kwargs):
            self.wrapped_instance = cls(*args, **kwargs)

        def __getattr__(self, name):
            attr = getattr(self.wrapped_instance, name)
            if callable(attr):
                def logged_method(*args, **kwargs):
                    print(f"'{name}' 메서드가 호출되었습니다.")
                    return attr(*args, **kwargs)
                return logged_method
            return attr
    return WrappedClass

@method_logger
class Calculator:
    def add(self, a, b):
        return a + b

    def multiply(self, a, b):
        return a * b

calc = Calculator()
print(calc.add(2, 3))
print(calc.multiply(3, 4))

여러 데코레이터의 조합

여러 데코레이터를 한 함수에 적용할 수 있습니다. 이 경우, 데코레이터는 아래에서 위로 실행됩니다.

def decorator_one(func):
    def wrapper(*args, **kwargs):
        print("첫 번째 데코레이터 동작")
        return func(*args, **kwargs)
    return wrapper

def decorator_two(func):
    def wrapper(*args, **kwargs):
        print("두 번째 데코레이터 동작")
        return func(*args, **kwargs)
    return wrapper

@decorator_one
@decorator_two
def greet(name):
    print(f"안녕하세요, {name}님!")

greet("영희")

출력:

첫 번째 데코레이터 동작
두 번째 데코레이터 동작
안녕하세요, 영희님!

 

'Language > Python' 카테고리의 다른 글

Python context manager (with의 동작 원리)  (0) 2023.10.29
Python 이터레이터와 제너레이터  (0) 2023.10.27
Python 예외 처리(Exception, try-except)  (0) 2023.10.26
Python 모듈(module)과 패키지(package)  (0) 2023.10.25
Python 객체지향 프로그래밍 (OOP)  (0) 2023.10.24
Language/Python 추천 글
more
  • Python context manager (with의 동작 원리)
    Python context manager (with의 동작 원리)2023.10.29
  • Python 이터레이터와 제너레이터
    Python 이터레이터와 제너레이터2023.10.27
  • Python 예외 처리(Exception, try-except)
    Python 예외 처리(Exception, try-except)2023.10.26
  • Python 모듈(module)과 패키지(package)
    Python 모듈(module)과 패키지(package)2023.10.25
FRONTMAN

검색

250x250

방문자 수

Total
Today
Yesterday

카테고리

  • 분류 전체보기 (54)
    • Language (48)
      • JavaScript (15)
      • TypeScript (14)
      • Python (14)
      • Dart (5)
      • Java (0)
    • FE (6)
      • WEB (4)
      • React (0)
      • Flutter (1)
    • CS (0)
      • Algorithm (0)
      • Network (0)
    • DevOps (0)

공지사항

  • 전체보기

최근 글

인기 글

태그

  • 파이썬
  • function
  • 웹
  • Import
  • Type
  • export
  • inline frame
  • 타입
  • await
  • js
  • 타입스크립트
  • CLASS
  • nodejs
  • Flutter
  • JavaScript
  • frontend
  • OOP
  • tuple
  • 자바스크립트
  • typeScript
  • npm
  • Interface
  • web
  • Python
  • DART
  • 리스트
  • Modules
  • list
  • async
  • Object

최근 댓글

FRONTMAN :: hahekaku
CopyrightBluemivDesigned byBluemiv

티스토리툴바