装饰器

Posted deakin-du

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

装饰器:

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

2原则:a.不能修改被装饰的函数源代码,有可能会导致其他问题

     b.不能修改被装饰函数的调用方式

实现装饰器需要的知识点:

1知道装饰器其实就是函数

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

 只要在调用之前存在与内存中的函数,就可以调用

def test1():
    print(in the 1) #a先把这段字符串放到内存中
    test2()  #
def test2():
    print(in the 2)#b先把这段字符串放到内存中,与#a都是在调用前进行的,存起来以后再进行调用,因此不会报错
test1()


打印结果:
in the 1
in the 2    

 高阶函数:a.把一个函数名当做实参传给另外一个函数(见有点用版,在不改源代码的前提下增加功能,但是修改了调用方式)

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

 闲的蛋疼没卵用版

def test1():
    print(in the 1)
def test2(func):
    print(func)  #把test1赋值给func,打印test1的内存地址
    func()         #把test1赋值给了func,此行等于test1()
test2(test1)

打印结果:
<function test1 at 0x000001E373D97F28>
in the 1


 有点用版(函数名做实参传给另外一个函数):

import time
def test1():
    time.sleep(2)
    print(in the 1)
def test2(func):
    time_start=time.time()
    func() #运行test1
    time_stop=time.time()
    print(test1 start time is %s%(time_start))
    print(test1 stop time is %s%(time_stop))
    print(test1 running time is %s%(time_stop-time_start))
test2(test1) #修改了调用方式

运行结果:
in the 1
test1 start time is 1517248119.7000022
test1 stop time is 1517248121.7005115
test1 running time is 2.000509262084961

 嵌套函数:

def foo():
    print(in the foo)
    def bar():      #函数中再用def定义函数才叫嵌套函数
        print(in the bar)
    bar()
foo()

打印结果:
in the foo
in the bar

局部作用域和全局作用域的访问顺序:

x=0
def grandpa():
    x=1
    def father():
        x=2
        def son():
            x=3
            print(x)
        son()
    father()
grandpa()

打印结果:
3

铺垫结束,进入正题:

装饰器

 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码