- 更多详情,可参考:alex大王第4周博客,https://www.cnblogs.com/alex3714/articles/5765046.html
- 更多详情,可参考:linhaifeng4573 >>>>> python装饰器,https://blog.51cto.com/egon09/1836763
- (重要)装饰器进阶:https://www.cnblogs.com/wongbingming/p/10934356.html
前言
实现装饰器的知识储备:
- 函数及"变量"
- 高阶函数
- 嵌套函数
总体:高阶函数 + 嵌套函数 >>>> 装饰器
一、装饰器概念/原则
- 概念:
本质是函数,装饰其他函数,就是为其他函数添加附加功能- 原则:
- 不能修改被装饰的函数的源代码;
- 不能修改被装饰的函数的调用方式;
- 总而言之,装饰器不影响被装饰的函数;
二、函数及"变量"
1. 函数定义与变量定义对比
- def 函数名(): 函数体,可以认为基本相当于 x = 1;
- 如果在没有def声明函数前,调用函数,相当于没有定义变量x=1前,print(x);
- 可以结合此处图片,查看下方示例;
2. 函数定义与执行 >>> 示例
示例1
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
def func1():
print("in the func1")
def func2():
func1()
print("in the func2")
if __name__ == '__main__':
func2()
# 输出:
in the func1
in the func2
示例2
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
def func2():
func1()
print("in the func2")
def func1():
print("in the func1")
if __name__ == '__main__':
func2()
# 输出:
in the func1
in the func2
示例3
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
def func2():
func1()
print("in the func2")
func2()
def func1():
print("in the func1")
# 输出:
Traceback (most recent call last):
File "D:\Codes\s14_python3\def_learning.py", line 10, in <module>
func2()
File "D:\Codes\s14_python3\def_learning.py", line 6, in func2
func1()
NameError: name 'func1' is not defined
三、高阶函数
- 注意:
高阶函数传函数名时,实参不能传入"函数名+()"的形式,这么调用就代表传入的实参不是函数名,而是该传入函数执行完后return的结果
- 高阶函数一共有两种:
- 把一个函数名当作实参,传给另外一个函数,此时接收函数名为实参的函数;
— >>> 在不修改被装饰函数源代码的情况下,为其添加功能
- 返回值中包含函数名的函数;
— >>> 不修改函数的调用方式
四、嵌套函数
- 定义:
在一个函数体内部,使用def声明函数,才叫嵌套函数,一个函数内不def声明另一个函数,直接调用外部定义的函数叫函数调用,不叫函数嵌套;
- 内嵌函数使用范围:
</
不能在外部调用函数内部定义的函数,函数内部定义的函数只能在函数内部调用,且外部函数调用时才能一并调用,如下图;