day12-python装饰器

1.装饰器

1.1定义

装饰器的本质也是函数,他的作用主要是装饰其他函数,意思是为其他函数添加附加的功能。

1.2 原则

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

1.3 实现装饰器的知识

  • 函数是变量
  • 高阶函数
  • 嵌套函数

 

2. 函数是变量

def test():
    print('test')

demo = test  # 函数和变量一样可以赋值给其他变量
print(demo)  # 对应的是函数在内存中的地址
# <function test at 0x00000000004DCBF8>
demo()  # test

 

 

3. 高阶函数

什么函数可以被定义为高阶函数?

  • 把一个函数的名称当做实参传递给另外一个函数
  • 函数的返回值中拥有函数名称

3.1 函数名做实参

 

def add(x):
    return x * x

def result(x,y,func):# 函数名称func作为实参传递给result函数
    print(func(x) + func(y))

result(2,3,add)
# 13

3.2 返回函数名

 

def add(x):
    return x * x

def result(x,y,func):
    # 返回值中拥有函数名称func
    return func(x) + func(y)

res = result(2,3,add)
print(res)
# 13

 

 

4. 嵌套函数

嵌套函数的形式是在一个函数中使用def关键字定义另外一个函数,并且在函数中返回调用。具体的代码如下。

def test(num):
    def add(x):# 定义函数和定义变量一样、一样、一样。划重点,可以把add()函数当做一个局部变量
        num = x * x
        return num
return add(4) * num print(test(6)) # 96

 

5.实现装饰器

功能:定义一个函数,使用装饰器统计函数执行的时间

import time

def timer(func):
    def test():
        print('开始执行被装饰函数>>>>>')
        start_time = time.time()
        func()
        end_time = time.time()
        print('执行的时间为:',end_time - start_time)
    return test

@timer # 相当于test = timer(test)
def test():
    time.sleep(2) # 睡2秒
    print('in the test')

test()

执行结果:
开始执行被装饰函数>>>>>
in the test
执行的时间为: 2.031116008758545

 

6.装饰不同参数的函数

 

import time

def timer(func):
    def test(*args,**kwargs):
        print('开始执行被装饰函数>>>>>')
        start_time = time.time()
        func(*args,**kwargs)  # 装饰不同参数的函数
        end_time = time.time()
        print('执行的时间为:',end_time - start_time)
    return test

@timer
def test(name,age = 26):
    time.sleep(2) # 睡2秒
    print('我的名字是:',name,'年龄是:',age)

test('wl')

执行结果:
开始执行被装饰函数>>>>>
我的名字是: wl 年龄是: 26
执行的时间为: 2.000115156173706

 

posted @ 2018-12-13 23:05  炫风真是风  阅读(135)  评论(0编辑  收藏  举报