Python装饰器用法

一.装饰器的概念
1.装饰器的本质是函数
2.原则:
1.不能修改被装饰函数的源代码
2.不能修改被装饰函数的调用方式
3.装饰器对所装饰的函数是透明

装饰器 = 高阶函数+嵌套函数(不一定有)+闭包函数
高阶函数:将一个函数作为变量传递给另一个函数 =====> 函数即变量



1.首先我们要了解下函数的引用
def test():
print("in the test")


# # 调用方式一
# test()


# 调用方式二
a = test # 将test函数的内存地址给了a,引用的是test的内存地址,然后在调用
a()

===========================================================================

2.闭包函数
"""
闭包函数满足的条件:
1.闭包函数必须有内嵌函数
2.内嵌函数要用到上一级函数当中的变量
3.闭包函数必须返回内嵌函数
"""
def demo(a, b):
def func(x):
print(a * x + b)
return a * x + b

return func

a = demo(1, 2) # a = demo(1,2) 运行demo函数,最终结果就是拿到demo函数返回的func内存地址给了a这个变量
a(5) # a就是func函数
 
===========================================================================

# 简单高阶函数一:
def test():
    print("in the test_case")


def test_1(func): # 高阶函数
print(func) # 打印函数的内存地址
func()


test_1(test)



# 简单的高阶函数二
def test():
time.sleep(2)
print("in the test_mycar")


def demo(func):
start_time = time.time()
func()
stoptime = time.time()
print("运行的时间是{}".format(stoptime - start_time))
return func # 必须返回一个函数(加了return是一个装饰器,没有加就是一个高阶函数)


# 调用方法1
# demo(test)


# 调用方法2
test_01 = demo(test) # test 就是demo函数返回的func内存地址
test_01()

===========================================================================
# 复杂的高阶函数

import time

def timer(func): # ===>timer 是一个高阶函数
def demo():
start_time = time.time()
func()
stoptime = time.time()
print("运行的时间是{}".format(stoptime - start_time))

return demo # 必须返回一个函数,返回的是函数的内存地址


def test_2():
time.sleep(2)
print("我是被装饰的函数")


test_2 = timer(test_2) # test_2 和demo是一样的内存地址
test_2() # 实际就是demo函数在调用

===========================================================================


# 简单装饰器
import time

def timer(func): # ===>timer 是一个高阶函数
def demo():
start_time = time.time()
func()
stoptime = time.time()
print("运行的时间是{}".format(stoptime - start_time))

return demo # 必须返回一个函数,返回的是函数的内存地址


@timer
def test_2():
time.sleep(2)
print("我是被装饰的函数")


test_2()
===========================================================================

# 有参数的装饰器

import time

def timer(func):
def demo(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
stoptime = time.time()
print("运行的时间是{}".format(stoptime - start_time))

return demo


@timer
def test_2():
time.sleep(2)
print("我是被装饰的函数")


@timer
def test_03(x, y):
time.sleep(2)
print(x)
print(y)


test_2()
test_03(1, 4)
 
原文地址:https://www.cnblogs.com/pywen/p/14950018.html