python 基础篇 11 函数进阶----装饰器

11. 前??能-装饰器初识
本节主要内容:
1. 函数名的运?, 第?类对象
2. 闭包
3. 装饰器初识

一:函数名的运用:

函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数.

?. 闭包
什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 叫闭包

可以使用_clesure_检测函数是否是闭包  返回cell则是闭包,返回None则不是

闭包的好处:

      由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函
数访问的时间和时机就不?定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这
个时候. 想?想. 我们之前说过, 如果?个函数执?完毕. 则这个函数中的变量以及局部命名
空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执?. 所
以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡.
将会常驻在内存中. 也就是说. 使?闭包, 可以保证外层函数中的变量在内存中常驻. 这样做
有什么好处呢? 非常?的好处. 我们来看?个关于爬?的代码: 

综上, 闭包的作?就是让?个变量能够常驻内存. 供后?的程序使?

 三. 装饰器初识
在说装饰器之前啊. 我们先说?个软件设计的原则: 开闭原则, ?被成为开放封闭原则,
你的代码对功能的扩展是开放的, 你的程序对修改源代码是封闭的. 这样的软件设计思路可以
更好的维护和开发.
开放: 对功能扩展开放
封闭: 对修改代码封闭

执行 warter()就行了

 现在问题?来了. 你这个函数写好了. 但是由于你添加了功能. 重新创建了个函数. 在这之
前访问过这个函数的?就必须要修改代码来访问新的函数water() 这也要修改代码. 这个也不
好. 依然违背开闭原则. ?且. 如果你这个函数被?量的?访问过. 你让他们所有?都去改. 那
你就要倒霉了. 不?死你就??了.
那怎么办才能既不修改原代码, ?能添加新功能呢? 这个时候我们就需要?个装饰器了. 装
饰器的作?就是在不修改原有代码的基础上, 给函数扩展功能.

 1. ?先访问warter(create_people).

 2. 把你的?标函数传递给warter的形参fn. 那么后?如果执?了fn意味着执?了你的?
标函数create_people
3. warter()执?就?句话. 返回inn
er函数. 这个时候. 程序认为warter()函数执?完. 那么

前?的create_people函数名被重新覆盖成inner函数
4. 执?create_people函数. 实际上执?的是inner函数. ?inner中访问的恰恰使我们最开
始传递进去的原始的create_people函数

结论: 我们使?warter函数把create_people给包装了?下. 在不修改create_people的前提下.
完成了对create_people函数的功能添加

 返回值和参数我们都搞定了. 接下来给出装饰器的完整模型代码(必须记住)

 def warter(fn):

  def inner(*args,**kwargs):

    print("哈哈")

     ret=fn(*args,**kwargs)

    print("呵呵")

    return ret

  reture inner

 @warter

def yue():

  print()

yue()

必须记住,记不住写100遍

原文地址:https://www.cnblogs.com/dalaoban/p/9184318.html

时间: 2025-01-31 09:38:32

python 基础篇 11 函数进阶----装饰器的相关文章

Python基础(7)闭包函数、装饰器

一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用 那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() name='ares' def func2() print(name) #有参和返回值的闭包函数 def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) stop

python 基础篇 10 函数进阶

本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作?域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ?. 函数参数--动态传参之前我们说过了传参, 如果我们需要给?个函数传参, ?参数?是不确定的. 或者我给?个函数传很多参数, 我的形参就要写很多, 很?烦, 怎么办呢. 我们可以考虑使?动态参数.形参的第三种: 动态参数动态参数分成两种 ::: 1--->>>动态接收位置参数 首先,先回顾依稀位置参数: 注意:动

Python开发基础-Day7-闭包函数和装饰器基础

补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其他局部作用域中使用全局变量,声明后可以在其他作用于中修改和使用 x=1 #全局赋值变量 def foo(): global x #函数内部全局声明变量x x=1111111 #函数内部修改全局变量x print(x) foo() print(x) global声明的变量在任何作用域都能够修改,所以一般非必要情

Python 基础 -2.4 函数进阶

名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种,分别如下 locals: 是函数内的名称空间,包括局部变量和形参 globals: 全局变量 builtins: 内置模块的名字空间 不同变量的作用域不同就是由这个变量所在的命名空间决定的. 作用域即范围 全局范围:全局存活,全局有效 局部范围:临时存活,局部有效 查看作用域方法 globals()

Python(72)_生成器函数与装饰器复习

1  装饰器复习,注意打印的顺序 #-*-coding:utf-8-*- import os import time ''' 语法糖 ''' def wrapper(f): # 装饰器函数 ,f是被装饰的函数 def inner(*args,**kwargs): # 定义了内部函数,一定和return inner对应 ''' 在被装饰函数执行前要做的事情''' print('在被装饰函数执行前要做的事情') ret = f(*args,**kwargs) # 这句话是真正函数的执行 ''' 在被

Python心得基础篇【10】装饰器

1 def outer(func): 2 def inner(*arg, **kwargs): 3 print('123') 4 ret = func(*arg, **kwargs) 5 print('112233') 6 return ret 7 return inner 8 9 10 def home(s1, s2): 11 return 'home' 12 13 14 def show(s1, ss): 15 return 'show' 16 17 @outer 18 def f1(arg

python之路,Python基础篇3 函数(第三周)

1.set 无序,不重复序列.可嵌套 2.函数 ==> 定义函数,函数体不执行,只有调用函数时,函数体才执行 1.def 2.名字 3.函数体 4.返回值 5.参数 普通参数 指定参数 默认参数 动态参数 *args **kwargs 万能参数 *args,**kwargs 6.补充: a. def f1 def f2 函数重新赋值 b. 引用 c.全局变量 读,均可读 赋值,先global 字典,列表,可修改 ==>全局变量用大写 3.三元运算 4.lamba表达式 函数: 编程分为两种:

函数-函数进阶-装饰器

想象一下: 你是一家视频网站的后端开发工程师,你们网站有以下几个版本: def home(): print("----首页----") def america(): print("----欧美专区----") def japan(): print("----日韩专区----") def henan(): print("----河南专区----") 视频刚上线初期,为了吸引用户,你们采取了免费政策,所有视频免费观看,迅速吸引了一

第二模块·函数编程-第1章 函数、装饰器、迭代器、内置方法

01-鸡汤之人丑就要多读书 02-三元运算 03-文件处理 04-文件处理-二进制模式 05-文件处理-智能检测编码的工具 06-文件处理-写模式操作文件 07-文件处理-追加模式操作文件 08-文件处理-混合操作文件 09-文件操作其他功能 10-文件处理-文件修改功能 11-函数-基本介绍 12-函数-默认参数 13-函数-关键参数 14-函数-非固定参数 15-函数-非固定参数2 16-函数-返回值 17-函数-局部变量 18-函数-在函数里修改全局变量 19-函数-在函数里修改列表数据