주의, 제가 마크업을 개같이 해서 보기가 좀 눈깽이며, 랙이 걸릴수 있습니다
Q
python 데코레이터를 만들려고 한다
option1 : "class로 만듬" and not "function으로 만듬"
option2 : "대코레이터 인자 (ex : @some_deco(1))를 처리함"
option3 : "대코레이터가 처리하는 함수의 입력값을 처리함"
option4 : "대코레이터가 처리하는 함수의 반환값을 처리함"
option5 : [option1, option2, option3, option4] = list(map(bool, map(int, list(bin(x)[2:])))) 이다, 이는 파이썬 소스코드형식으로 설명하였다.
이때 option5가 0~15까지에 대하여 option1 ~ option4까지의 불리언 옵션으로 각각 처리한다, python for in문과 같다.
각각의 처리된 설명는 다음 출력 형식을 만족해야 한다.
1. 옵션이 적용되는 대코레이터와, 예제, 독스트링을 포함한 소스코드를 작성한다
2. 소스코드 아래에는 그 소스코드에 대하여, 콘솔에 실행되는 print된 값을 <code>블럭에 적으시오
3. 2번 아래 (참고 : 1번아래 2번아래 3번.) 디버그/분석을 말로 서술하여 쓰시오
처리한다는 말이, 각각 서술하라는 말이다
A
Decorater
이해하였습니다. 이제 각 옵션에 따라 다양한 데코레이터를 생성해보겠습니다.
option1
: 클래스를 사용하여 데코레이터를 만듭니다. 이 경우 함수를 사용하는 것이 아닙니다.
pythonclass MyDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Before call")
result = self.func(*args, **kwargs)
print("After call")
return result
@MyDecorator
def hello():
print("Hello, world!")
hello()
Before call
Hello, world!
After call
이 코드는 MyDecorator
라는 클래스를 정의하고, 이 클래스의 인스턴스를 함수처럼 호출할 수 있게 합니다. @MyDecorator
데코레이터는 hello
함수를 MyDecorator
의 인스턴스로 바꿉니다. hello()
를 호출하면 실제로는 MyDecorator.__call__()
메소드가 호출됩니다.
option2
: 데코레이터가 인자를 받습니다. 이 경우 데코레이터를 생성하는 외부 함수를 추가로 정의해야 합니다.
pythondef repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
@repeat(3)
def greet(name):
print(f"Hello {name}")
greet("World")
Hello World
Hello World
Hello World
이 코드는 repeat
라는 데코레이터를 정의하고, 이 데코레이터는 num_times
라는 인자를 받습니다. @repeat(3)
데코레이터는 greet
함수를 3번 반복하여 호출합니다.
option3
: 데코레이터가 처리하는 함수의 입력값을 처리합니다.
pythondef trace(func):
def wrapper(*args, **kwargs):
print(f"Trace: calling {func.__name__}() "
f"with {args}, {kwargs}")
original_result = func(*args, **kwargs)
print(f"Trace: {func.__name__}() "
f"returned {original_result!r}")
return original_result
return wrapper
최악의 마크업 선정 1위일듯 ㅠㅠ 그냥 복붙도 더러우ㅝ ㅠㅠㅠ