#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/8/16 14:57
# @Author : zhengzhen
import datetime
# 装饰器
# 例如一个日志记录器 拦截方法
def log(func):
def wrapper(*args, **kwargs):
print("call %s() in %s" % (func.__name__, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
return func(*args, **kwargs)
return wrapper
# 假如下面是一个插入用户的方法 我们需要记录下操作这个方法的事件日志
@log
def insertUser(*, name, age, city, work):
pass
insertUser(name='', age=12, city='', work='Java工程师')
# 如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本
def log2(text):
def decorator(func):
def wrapper(*args, **kwargs):
print("%s %s()" % (text, func.__name__))
return func(*args, **kwargs)
return wrapper
return decorator
@log2("执行")
def insertUser2(*, name, age, city, work):
pass
# @log2("执行") = log2("执行")(insertUser2)
insertUser2(name='', age=12, city='', work='Java工程师')
# 这样的话在有些地方的代码依赖name信息就会出问题的 ,所以还差最后一步
print(insertUser2.__name__) # name变成了 wrapper
# 需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。
# 不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:
import functools
def log3(text):
def decortor(func):
@functools.wraps(func)
def warper(*args, **kwargs):
print("%s %s()" % (text, func.__name__))
return func(*args, **kwargs)
return warper
return decortor
@log3("执行")
def insertUser3(*, name, age, city, work):
pass
print(insertUser3.__name__) # =====> insertUser3
请编写一个decorator,能在函数调用的前后打印出'begin call'
和'end call'
的日志。
def log4(func):
@functools.wraps(func)
def warp(*args, **kwargs):
print("begin call")
c = func(*args, **kwargs)
print("end call")
return c
return warp
@log4
def insertUser4(*, name, age, city, work):
print("in function")
insertUser4(name='', age=12, city='', work='Java工程师')
def log5(text=''):
def decottor(func):
@functools.wraps(func)
def warper(*args, **kwargs):
print("%s begin %s call" % (text,func.__name__))
c = func(*args, **kwargs)
print("%s end %s call" % (text,func.__name__))
return c
return warper
return decottor
@log5()
def insertUser5_1():
print("in function")
insertUser5_1()
@log5("大家好")
def insertUser5_2():
print("in function")
insertUser5_2()