首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

装饰器-初识

函数调用的顺序

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171218A0VQ8100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券