前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装饰器-初识

装饰器-初识

作者头像
企鹅号小编
发布2018-02-20 22:26:20
4510
发布2018-02-20 22:26:20
举报
文章被收录于专栏:企鹅号快讯企鹅号快讯

函数调用的顺序

和其他语言类似。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支持静态嵌套域)

本文来自企鹅号 - Python热爱着媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - Python热爱着媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档