참조 장식의 장식을 디자인하십시오, 그것은 모든 기능에 적용 할 수 있습니다

최근, 작은 파트너 인터뷰, 매우 흥미로운 질문을 충족 :
경우 참조 장식의 장식을 디자인하세요, 그것은 초는 매개 변수로 받아 들일 수 int를 필요로하는 모든 기능에 적용 할 수는 수행하는 데 필요한 실행 인쇄의 지정된 초보다 큰 시간의 함수를 수행하여 함수의 실행시의 이름을 변경.

인터뷰 전에 나는이 문제의 개발하자, higher-order 함수의 방법으로 달성하고, 지금 속히, 만났다가 발생했습니다.

먼저오고 분석 아래 :

인수 장식 1 -> higher-order 함수

2 실행 시간 -> 시간 라이브러리

코드에서 :

from functools import wraps
import time

# 面向对象写法
class TakeTime:
    def __init__(self, para: int):
        self.para = para

    def __call__(self, func):
        @wraps(func)
        def wrapped(*args, **kwargs):
            start_time = time.time()
            name = func.__name__
            func(*args, **kwargs)
            count_time = time.time() - start_time
            if self.para >= count_time:
                print("the {name} take {time}, less time".format(name=name, time=count_time))
            else:
                print("the {name} take {time}, more time".format(name=name, time=count_time))
            return func
        return wrapped

# 常规写法
def func_time(para: int):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            name = func.__name__
            func(*args, **kwargs)
            count_time = time.time() - start_time
            if para >= count_time:
                print("the {name} take {time}, less time".format(name=name, time=count_time))
            else:
                print("the {name} take {time}, more time".format(name=name, time=count_time))
            return func
        return wrapper
    return decorator

@TakeTime(10)
def log():
    for x in range(10):
        time.sleep(0.5)

@func_time(10)
def log1():
    for x in range(10):
        time.sleep(0.5)

추천

출처blog.51cto.com/14730644/2474992