函数调用的顺序
和其他语言类似。python函数在未经声明之前,不允许对其引用和调用。
函数的功能与作用
需要添加一个打印日志功能。
在没学函数的时候,只能用print显示打印,例如:
学了函数以后可以定义一个函数,例如:
装饰器的功能与特点
对已经上线的代码需要添加功能:
问题:
1、代码行数很多,查找很麻烦,而且要挨个找出,把新功能函数加进去。
2、代码已经上线,对源代码修改可能会导致未知故障发生。(新增功能是不能修改源代码的)
3、代码已经上线,不光源代码不能随便修改,就连函数调用方式也不能随意修改。
解决方法:使用装饰器进行代码修饰。
装饰器的概述一、定义:
装饰器本身就是一个函数,遵循函数的声明,引用,调用,作用域等相关规则。
二、作用:
装饰器:目的是(装饰其他函数)就是为其他函数添加附加功能。
三、用途:
装饰器:最常见的用途主要体现在用户登录与权限认证。
四、原则:
1、不能修改被装饰的函数的源代码。
2、不能修改被装饰的函数的调用方式。
3、装饰器对被装饰的函数时完全透明的。(源代码感知不到装饰器函数的存在,但装饰器函数确实影响着源代码)
五、调用方法:
一个原函数体可以调用多个装饰器,执行顺序如下:
装饰器的知识储备
1、函数即"变量"
2、高阶函数。
3、嵌套函数。
最终:高阶函数+嵌套函数 =》装饰器函数
知识点一:函数即“变量”:
定义一个x或者y是装在内存中声明一个内存块,并通通过存地址指定给x或者y,当调用x或者y时可以加载在内存块中进行引用或调用。
定义一个test的函数的原理同上。
定义一个无名子的函数体原理也同上。
注意:
解释器会先回收无名子的函数体所占的内存块(即lambda的函数模块)
del 并不是删除内存块,而是直接删除内存定义的名字,通过解析器在清除内存块。
知识点二、高阶函数:
满足下面两个条件之一就是高阶函数
a:把一个函数名当做实参传给另外一个函数,即某一函数当做参数传入另一个函数中(在不修改被装饰函数源代码的情况下添加功能)
b:返回值中包含函数名,即函数的返回值包含n个函数,n>0(不修改函数的调用方式)
练习a:
重点:结合装饰器的重要的两个特点,做个练习1:
1、不能修改被装饰的函数的源代码。
2、不能修改被装饰的函数的调用方式。
问题:
1、装饰器并没有修改源代码bar
2、由于test1(bar)改变了调用函数的方式,因此不符合装饰器的条件。
注释:
test1(bar)与test1(bar())的区别:
test1(bar):是把内存地址通过实参方式传给test1函数作为形参。
test1(bar()):是把内存中的函数体通过 实参方式传给test1函数作为形参。
练习b:返回值中包含函数名。(不修改函数的调用方式)
14#定义一个形参,用于接收调用test1函数的实参,如果传过来的是函数名,则该函数已经被应用。
知识点三、嵌套函数:
在一个函数体内创建另外一个函数,这种函数就叫内嵌函数(基于python支持静态嵌套域)
领取专属 10元无门槛券
私享最新 技术干货