티스토리 뷰

[Decorator: func]


- 로그를 남길때


- 성능을 측정할 때


- 유저의 상태를 남기기 위한 redirect



[performance.py]


일반 함수에 사용될 경우

import time


def stop_watch(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print("{}: delay={}".format(func.__name__, time.time()-start))
return result
return wrapper

class 함수에 사용될 경우 인자 맨앞에 self 를 위치 시킨다.

import time


def stop_watch(func):
def wrapper(self, *args, **kwargs):
start = time.time()
result = func(self, *args, **kwargs)
print("{}: delay={}".format(func.__name__, time.time()-start))
return result
return wrapper



[main.py]

import performance


def is_prime(n):
for i in range(2, n):
if n % i == 0:
return False
return True


@performance.stop_watch
def count_prime(n):
cnt = 0
for i in range(2, n+1):
if is_prime(i):
cnt += 1
return cnt


print(count_prime(30000))




[Decorator: class]


위의 decorator 를 클래스로 구현해 보자



class Deco:
def __init__(self, func):
self.func = func

def __call__(self, *args, **kwargs):
import time
start = time.time()
result = self.func(*args, **kwargs)
print("{}: delay={}".format(self.func.__name__, time.time()-start))
return result

def is_prime(n):
for i in range(2, n):
if n % i == 0:
return False
return True


@Deco
def count_prime(n):
cnt = 0
for i in range(2, n+1):
if is_prime(i):
cnt += 1
return cnt



이렇게도 구현 가능하다

class Cls:
class Decorator:
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs

def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
print("start decorator", self.args, self.kwargs)
return func(*args, *kwargs)
return wrapper

def __init__(self):
pass

@Decorator(1, 2, 3, age="20", name="kim")
def foo(self):
print("start foo")
return -1


c = Cls()
print(c.foo())




댓글