일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- gRPC
- prg 패턴
- 프로그래머스
- 트랜잭샨
- 디버깅
- 구현
- 검색어 추천
- docker
- branch 전략
- jwt 표준
- piplining
- 결제서비스
- 코드 계약
- BFS
- 쿠키
- 깊게 생각해보기
- AWS
- 수신자 대상 다르게
- 좋은 코드 나쁜 코드
- 레디스 동시성
- 누적합
- 완전탐색
- 알람 시스템
- spring event
- 카카오
- 숫자 블록
- 객체지향패러다임
- 이분탐색
- 셀러리
- Today
- Total
코딩관계론
파이썬 데코레이터(Decorator) 본문
파이썬 데코레이터(Decorator)란 기존의 코드에 추가적인 기능을 더해주는 역할을 합니다.
장점
코드 재사용성이 높아집니다.
데코레이터는 여러 함수나 메소드에 적용할 수 있으므로, 중복되는 코드를 많이 줄일 수 있습니다. 예를 들어, 인증이 필요한 기능을 가진 많은 함수가 있다면, 데코레이터를 이용해 인증을 한 번만 처리하고 해당 함수를 호출할 수 있습니다.
def authenticated(func):
def wrapper(request, *args, **kwargs):
if request.user.is_authenticated:
return func(request, *args, **kwargs)
else:
return HttpResponse(status=401)
return wrapper
@authenticated
def my_view(request):
# 인증된 사용자에게만 허용되는 기능
pass
코드의 가독성 및 중복을 제거합니다.
데코레이터를 이용해 코드의 전처리나 후처리를 처리하면, 해당 처리 코드가 함수 본문에 분산되지 않고, 데코레이터 함수 내부에 명확하게 표현됩니다. 이렇게 함으로써 코드의 가독성 및 중복이 제거됩니다.
import time
def measure_time(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 함수 실행 시간: {end - start}초")
return result
return wrapper
@measure_time
def add(a, b):
return a + b
@measure_time
def subtract(a, b):
return a - b
@measure_time
def multiply(a, b):
return a * b
@measure_time
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero!")
return a / b
만약 아래와 같은 데코레이터가 없었다면, my_function의 실행 시간을 측정하는 코드가 내부에 작성되어야만하기 때문에 분문이 분산되고, 또 다른 함수에서 실행시간 측정이 필요하다면 같은 코드를 재작성해야 합니다.
import time
def add(a, b):
start = time.time()
result = a + b
end = time.time()
print(f"add 함수 실행 시간: {end - start}초")
return result
def subtract(a, b):
start = time.time()
result = a - b
end = time.time()
print(f"subtract 함수 실행 시간: {end - start}초")
return result
def multiply(a, b):
start = time.time()
result = a * b
end = time.time()
print(f"multiply 함수 실행 시간: {end - start}초")
return result
def divide(a, b):
start = time.time()
if b == 0:
raise ZeroDivisionError("Cannot divide by zero!")
result = a / b
end = time.time()
print(f"divide 함수 실행 시간: {end - start}초")
return result
유지보수성을 높입니다.
데코레이터를 이용해 코드의 전처리나 후처리를 처리하면, 해당 처리를 모든 함수 본문에 적용할 필요가 없으므로, 유지보수성이 높아집니다. 또한, 데코레이터 함수 자체를 수정하면, 해당 데코레이터를 사용하는 모든 함수에 대해 일괄적으로 적용됩니다.
예시는 위의 예시와 동일합니다.
프로그램의 확장성을 높입니다.
데코레이터를 이용해 코드의 전처리나 후처리를 처리하면, 해당 처리를 유연하게 변경할 수 있습니다. 새로운 요구사항이 생겨서 기존 코드를 변경해야 할 때도, 데코레이터 함수만 수정하면, 해당 처리를 사용하는 모든 함수에 대해 일괄적으로 변경할 수 있습니다.
여기서 궁금증은 클래스 상속도 프로그램의 확정성을 높이고, 데코레이터도 프로그램의 확장성을 높이는데 무엇이 다른가입니다
데코레이터와 클래스 상속의 차이점은 다음과 같습니다.
- 적용 대상: 데코레이터는 함수에 적용되며, 클래스 상속은 클래스에 적용됩니다.
- 기능: 데코레이터는 함수의 기능을 확장하거나 변경하는 데 사용됩니다. 클래스 상속은 클래스의 속성과 메소드를 상속받아 확장하는 데 사용됩니다.
- 코드 추상화: 데코레이터는 함수의 기능을 추상화하여 가독성을 높여주고, 중복 코드를 제거해주는 역할을 합니다. 클래스 상속은 기존 클래스의 코드를 재사용하여 중복 코드를 제거하고, 코드의 가독성을 높이는 역할을 합니다.
따라서, 데코레이터와 클래스 상속은 서로 보완적인 방법으로, 각각의 상황에 따라 적절히 사용될 수 있습니다. 예를 들어, 함수의 기능을 확장하는 경우에는 데코레이터를 사용하고, 클래스의 속성과 메소드를 확장하는 경우에는 클래스 상속을 사용할 수 있습니다.
'Clean code' 카테고리의 다른 글
코드 계약 (0) | 2023.05.18 |
---|---|
코드 추상화 (0) | 2023.05.15 |
[Clean code] 클래스 (0) | 2023.01.11 |
[Clean code] 형식 맞추기 (0) | 2023.01.09 |
[Clean code] 자료추상화 (1) | 2023.01.06 |