首页 > 代码库 > python基础之装饰器

python基础之装饰器

一 什么是装饰器

器即函数

装饰即修饰,意指为其他函数添加新功能

装饰器定义:本质就是函数,功能是为其他函数添加新功能 #装饰器本身就是函数,被装饰的也是函数。

 

为什么要用装饰器:
及开放封闭原则。
代码上线后,就是为了尽量避免修改,不修改原函数的源代码和调用方式。 # 函数及定义和使用。

装饰器语法:

在被装饰上的正上方写一个@,它会把@这一行下面这一行的函数传递到函数里,再重新赋值给index。

func就是index函数,print(func)返回得是index内存地址。

二 装饰器需要遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)

2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三 实现装饰器知识储备

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

四 高阶函数

高阶函数定义:
1.函数接收的参数是一个函数名

2.函数的返回值是一个函数名

3.满足上述条件任意一个,都可称之为高阶函数

技术分享
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)

高阶函数示范
高阶函数示范
技术分享
#高阶函数应用1:把函数当做参数传给高阶函数
import time
def foo():
    print(from the foo)

def timmer(func):
    start_time=time.time()
    func()
    stop_time=time.time()
    print(函数%s 运行时间是%s %(func,stop_time-start_time))
timmer(foo)
#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式

把函数当做参数传给高阶函数
把函数当作高阶函数传给参数
技术分享
#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
import time
def foo():
    print(from the foo)

def timmer(func):
    start_time=time.time()
    return func
    stop_time=time.time()
    print(函数%s 运行时间是%s %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

函数返回值是函数名
函数返回值是函数名

高阶函数总结
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

五 函数嵌套

def father(name):
    print(‘from father %s‘ %name)
    def son():
        print(‘from son‘)
        def grandson():
            print(‘from grandson‘)
        grandson()
    son()

father(‘林海峰‘)

六 闭包

‘‘‘
闭包:在一个作用域里放入定义变量,相当于打了一个包
‘‘‘
def father(name):
    def son():
        # name=‘alex‘
        print(‘我爸爸是 [%s]‘ %name)
        def grandson():
            # name=‘wupeiqi‘
            print(‘我爷爷是 [%s]‘ %name)
        grandson()
    son()

father(‘林海峰‘)

七 无参装饰器

 

 

装饰器举例

技术分享

技术分享

 

python基础之装饰器