Python学习笔记之装饰器原理
def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper def apple():
print("购买苹果") def orange():
print("购买橘子") def potato():
print("购买土豆") ap = decorator(apple)
ap() ora = decorator(orange)
ora() po = decorator(potato)
po()
运行结果

(1) 装饰器相当于使用闭包函数封装公共部分的函数:
在decorator函数中, 定义一个闭包函数 wrapper, 而wrapper函数内部除了输出公共部分print("询价") print("购买成功!")
(2) decorator装饰器传入形参fn作为函数返回
参数fn传入装饰器后, 在闭包函数内部作为函数调用fn()
切记: wrapper作为闭包函数,必须返回
(3) 自定义不同函数 apple, orange, potato ...,作为实参传入装饰器
2 . 赋值给变量
ap = decorator(apple)
1 . 调用
ap()
(4)修改
直接在函数上方使用@decorator就可以调用装饰器,无需再将赋值给变量
调用函数即可
def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper @decorator
def apple():
print("购买苹果") @decorator
def orange():
print("购买橘子") @decorator
def potato():
print("购买土豆") # ap = decorator(apple)
# ap()
#
# ora = decorator(orange)
# ora()
#
# po = decorator(potato)
# po()
apple()
orange()
potato()
(5)添加可变参数
由于调用的函数参数是不固定的,所以传入装饰器的参数必须是可变参数 *args ,其中args是自定义的,可根据实际情况改为具有实际意义的变量


(6)添加关键字参数:**kwargs中的kwargs可自定义


(5)总结
装饰器的作用其实就是封装复用的代码,并且可以将新增的公共代码写在装饰器中,避免了在函数内部扩展代码。秉承了函数的封闭性和开放性,即对修改是封闭的,对扩展是开放的 , 需要在装饰器传入可变参数和关键字参数,调用的函数才能传参。
Python学习笔记之装饰器原理的更多相关文章
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- python学习笔记之装饰器、生成器、内置函数、json(五)
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- Python学习系列之装饰器
装饰器的作用 装饰器用于装饰某个函数.方法或者类,它可以让这个函数执行之前或者执行之后做一些操作 手工实现一个装饰器 def outer(some_func): #装饰器 $1 def inner() ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python学习日记(装饰器的补充)
如何返回被装饰函数的函数名及注释? 问题及实现 先看典型的装饰器: def wrapper(f):#装饰器函数,f是被装饰函数 def inner(*args,**kwargs): '''执行函数之前 ...
随机推荐
- tensorflow的ckpt文件总结
1.TensorFlow的模型文件 --checkpoint_dir | |--checkpoint | |--MyModel.meta | |--MyModel.data-00000-of-0000 ...
- present simple, continuous, and be going to 三者区别
https://www.youtube.com/watch?v=a03VKQL0dZg&list=PLZOJurmtexYozmvQGAJnVg3lgiZw0mj-y HOW TO USE F ...
- PHP之获取终端用户IP
// function get_real_ip() { $ip=false; $clientip = "clientip"; $xrealip = "xrealip&qu ...
- selenium+iframe 如何定位元素(实战)
场景: 在同一界面,需定位iframe里面的元素, 就需要切换至Iframe块,然后定位元素,验证完成后,再切换出来. 如果不切换至iframe ,会发现不管采取什么定位,都会报元素不存在.
- 虚拟机VirtualBox与CentOS 7安装
一.VirtualBox 我们电脑的操作系统一般都是Windows,如果我们要学习Linux,那么可以在我们的电脑上装个虚拟机,然后在这虚拟机上安装Linux.虚拟机可以用VirtualBox 或者 ...
- 【PyQt5-Qt Designer】pyqtSignal()-高级自定义信号与槽
PyQt 5信号与槽的几种高级玩法 参考:http://www.broadview.com.cn/article/824 from PyQt5.QtCore import QObject , pyqt ...
- SpringBoot-@async异步执行方法
启动加上@EnableAsync ,需要执行异步方法上加入 @Async 在方法上加上@Async之后 底层使用多线程技术 演示代码: @RestController @Slf4j public c ...
- Ubuntu上Xilinx ARM交叉编译器安装
1,Windows中下载交叉编译器 2,在ubuntu中创建zedboard目录,并将交叉编译器复制进来 3,将该交叉编译器设置成可执行程序 chmod a+x xilinx-2011.09-50 ...
- MATLAB中产生随机数的那些函数
1.产生从imin~imax的m*n矩阵 randi([imin,imax],m,n); 2.产生1~n的无重复随机整数 randperm(n);
- 【托业】【新托业TOEIC新题型真题】学习笔记9-题库七+八--P4-5
109.intend 意为“打算,意欲”,含有将来的含义,故不用将来时态 110.must do sth 必须做某事 111.recession 经济衰退,不景气 rebound 反弹:反应 recr ...