装饰器(Decorators)可以实现在不变原有python 代码功能的基础上增加功能代码。
框架
def outer2(func): def inner(*args, **kwargs): func(*args, **kwargs) return inner @outer2 def foo(a, b, c): print (a+b+c)
示例一:
import time from functools import wraps def time_checker(func): @wraps(func) def inner(*args, **kwargs): time_start = time.time() ret = func(*args, **kwargs) print(f'{func.__name__} running time is {time.time() - time_start} 秒') return ret return inner @time_checker def func1(): time.sleep(1) print(f'now func1 is running') if __name__ == '__main__': func1()
示例二:
from functools import wraps def logit(logfile='out.log'): def logging_decorator(func): @wraps(func) def wrapped_functions(*args, **kwargs): log_string = func.__name__ + ' was called' print(log_string) with open(logfile, 'a') as opend_files: opend_files.write(log_string + ' ') return func(*args, **kwargs) return wrapped_functions return logging_decorator @logit def myfunc1(): pass
示例三
def outer_arg(bar): def outer(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) print(bar) return ret return inner return outer # 相当于 outer_arg('foo_arg')(foo)() @outer_arg('foo_arg') def foo(a, b, c): return (a+b+c) print(foo(1,3,5))
示例四
class Count(object): def __init__(self, func): self._func = func self.num_calls = 0 def __call__(self, *args, **kwargs): # 模拟成函数,将类模拟成可调用的对象 self.num_calls += 1 print(f'num of call is {self.num_calls}') @Count def example(): print('hello')
示例五
def decorator(aClass): class newClass(object): def __init__(self, args): self.times = 0 self.wrapped = aClass(args) def display(self): # 将runtime()替换为display() self.times += 1 print('run times ', self.times) self.wrapped.display() return newClass @decorator class MyClass(object): def __init__(self, number): self.number = number # 重写display def display(self): print('number is', self.number) six = MyClass(6) for i in range(5): six.display()