Python/Python 기초

[Python] 데코레이터( @ ), 컨텍스트 매니저 ( with )

죵욜이 2024. 12. 2. 18:17

데코레이터(Decorator) 

데코레이터는 다른 함수(또는 메서드) 를 수정하거나 확장하는 데 사용되는 함수

기존 코드를 변경하지 않고, 추가적인 기능을 쉽게 부여할 수 있게 해줌

 

작동방식

  • 데코레이터는 또 다른 함수를 매개변수로 받아들이고, 새로운 함수를 반환합니다.
  •  @  기호를 사용하여 데코레이터를 함수나 클래스에 적용할 수 있습니다.
# 기본 데코레이터 정의
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("함수 호출 전")
        result = func(*args, **kwargs)
        print("함수 호출 후")
        return result
    return wrapper

# 데코레이터 적용
@my_decorator
def say_hello():
    print("안녕하세요!")

# 함수 호출
say_hello()
# 출력
함수 호출 전
안녕하세요!
함수 호출 후

데코레이터 체이닝

  • 여러 데코레이터를 하나의 함수에 적용 가능
  • 안쪽에서부터 밖으로 차례대로 적용
@decorator1
@decorator2
def my_function():
    pass
  •  decorator2  적용후 ->  decorator1  적용

 

컨텍스트 매니저 (  with  )

컨텍스트 매니저는 리소스를 획득하고 사용한 뒤, 자동으로 정리해주는 메커니즘

특정 블록이 시작되고 끝날 때 자동으로 실행되는 코드를 정의

 

기본구조

with 컨텍스트매니저 as 변수:
    # 작업 수행

 

 

작동 방식

  •  __enter__  메서드 :  with  블록에 들어가기 전에 실행됩니다
  •  __exit__  메서드 :  with  블록을 벗어날 때 실행됩니다.
with open('example.txt', 'w') as file:
    file.write('Hello, World!')
# 파일이 자동으로 닫힘

 

만약 with  문을 사용하지 않을경우 아래코드와 같은 의미

file = open('example.txt', 'w')
try:
    file.write('Hello, World!')
finally:
    file.close()

 

 

사용자 정의 컨텍스트 매니저

class MyContextManager:
    def __enter__(self):
        print("컨텍스트 진입")
        return "리소스"

    def __exit__(self, exc_type, exc_value, traceback):
        print("컨텍스트 종료")
        return False  # 예외를 무시하지 않음

with MyContextManager() as resource:
    print(resource)  # 출력: "리소스"