Python基础(六)-装饰器

一、装饰器简介

本质上是函数,功能是为其他han书添加新功能

1.1、装饰器遵循的原则

  • 不修改被装饰函数的源代码(开放封闭原则)
  • 为被装饰的添加新功能后,不修改被装饰函数的调用方式

1.2、实现装饰器的知识储备

  • 装饰器=高阶函数+函数嵌套+闭包

二、高阶函数

2.1、高阶函数的定义

  • 函数接受的是一个函数名
  • 函数的返回值是一个函数名
  • 满足上述条件的任意一个,都可以被称之为高阶函数
def foo():
    print('我的函数名作为参数传给高阶函数')
def gao_jie1(func):
    print('我就是高阶函数1,我接收的参数名是%s' %func)
    func()

def gao_jie2(func):
    print('我就是高阶函数2,我的返回值是%s' %func)
    return func

gao_jie1(foo)
gao_jie2(foo)

2.2、高阶函数的应用

1)将函数名传递给高阶函数

import time
def foo():
    time.sleep(3)
    print('你好')

def test(func):
    # print(func)
    start_time=time.time()
    func()
    stop_time = time.time()
    print('函数运行时间是  %s' % (stop_time-start_time))

test(foo)

你好
函数运行时间是  3.0009939670562744

#我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数test(foo),改变了函数的调用方式

2)高阶函数返回的是一个函数名

#没有改变函数的调用方式,但多运行了一次,不合格
import time
def foo():
    time.sleep(3)
    print('你好')

def test(func):
    # print(func)
    start_time=time.time()
    func()
    stop_time = time.time()
    print('函数运行时间是  %s' % (stop_time-start_time))
    return func

foo = test(foo)   #此时已经调用了foo,下面又调用了一次
foo()

你好
函数运行时间是  3.000460386276245
你好

3)没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能

import time
def foo():
    time.sleep(3)
    print('来自foo')

def timer(func):
    start_time=time.time()
    return func
    stop_time = time.time()
    print('函数运行时间是  %s' % (stop_time-start_time))

foo=timer(foo)
foo()

来自foo

猜你喜欢

转载自www.cnblogs.com/hujinzhong/p/11470878.html