python 基础 day04—装饰器

装饰器

定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能

 

原则:

  • 不能修改被装饰的函数的源代码
  • 不能修改被装饰的函数的调用方式

 

示例1

import time
def timmer(func): 
    def warpper(*args,**kwargs):
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func run time is %s" %(stop_time - start_time))
    return warpper


@timmer  
def test1():
    time.sleep(3)
    print("in the test1")

test1()

从示例1中我们可以看出装饰器符合上诉定义和原则

 

实现装饰器的知识储备如下:

  • 函数即“变量”
  • 高阶函数

    a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

    b.返回值中包含函数名(不修改函数的调用方式)

  • 嵌套函数

综上  

  高阶函数+嵌套函数==》装饰器

接下来我们来分析一下上面例子

无参装饰器

import time
def timmer(func):  #装饰器  func=test1—>timmer(test1)
    def warpper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func run time is %s" %(stop_time - start_time))
    return warpper


@timmer  # test1=timmer(test1)=warpper
def test1():
    time.sleep(3)
    print("in the test1")

test1()

 执行步骤:

1.执行装饰器@timmer ,@timmer相当于test1=timmer(test1),

  把test1传进timmer(),返回warpper

  所以test1=timmer(test1)=warpper

2.执行test1(),test1()=warpper()

  执行warpper()

  同时因为func为形参test1为传进timmer()的实参

  所以func()=test1()

warpper()执行过程为:

  1.获取开始时间

  2.执行func()=test1()

  3.获取结束时间

  4.打印信息

固定参数装饰器

# cherry cui
import time
def timmer(func):  #装饰器  func=test2—>timmer(test2)
    def warpper(name):
        start_time = time.time()
        func(name)
        stop_time = time.time()
        print("the func run time is %s\n" %(stop_time - start_time))
    return warpper


@timmer  #test2=timmer(test2)=warpper 所以test2(name)=warrpper(name)
def test2(name):
    time.sleep(2)
    print("name:",name)


test2("cherry")

  

 不固定参数装饰器

import time
def timmer(func):  #装饰器  func=test1—>timmer(test1)
    def warpper(args,*kwargs):
        start_time = time.time()
        func(args,*kwargs)
        stop_time = time.time()
        print("the func run time is %s\n" %(stop_time - start_time))
    return warpper


@timmer
def test2(name,age):
    time.sleep(2)
    print("name:",name)
    print("age:", age)


test2("cherry",17)

  

*args,**kwargs可接受存在或不存在的参数

因此

一个可有参和无参都适用的装饰器

import time
def timmer(func):  #装饰器  func=test1—>timmer(test1)
    def warpper(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        stop_time = time.time()
        print("the func run time is %s\n" %(stop_time - start_time))
    return warpper


@timmer  #test1=timmer(test1)
def test1():
    time.sleep(3)
    print("in the test1")

@timmer
def test2(name,age):
    time.sleep(2)
    print("name:",name)
    print("age:", age)


test1()
test2("cherry",17)

 

  

posted @ 2018-12-27 17:16  cherry_cui  阅读(141)  评论(0编辑  收藏  举报