python学习作业笔记五

#!/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()

猜你喜欢

转载自blog.csdn.net/QWERTY1994/article/details/81747761