day4 装饰器深入解析
Python装饰器
装饰器是在不修改源码给代码添加功能的常用方法。@是装饰的标志。我们知道,在给代码增加功能的时候,要遵循开放封闭的原则,不能随便更改原码,因此装饰器的功能就显示出来了,只需要在函数前面加上装饰器就能解决问题所需。
def verification(func):
#验证模块
def inner():
print("请输入你的账号和密码进行验证")
func()
return inner def f1():
print() def f2():
print() def f3():
print() def f4():
print() f2 = verification(f2)
print(f2)
f2()
上面代码中,我们给f2增加了一个验证功能,很多时候,我们需要在不改变原码的情况下对程序的功能进行扩展。上面是装饰器的原理。装饰器相当于在函数上面添加了一句代码f = func(f),让程序在执行的时候能够先进行验证,下面来看一下完整的装饰器。
def verification(func):
#验证模块
def inner():
print("请输入你的账号和密码进行验证")
func()
return inner def f1():
print() def f2():
print() def f3():
print() def f4():
print() f1 = verification(f1)
f2 = verification(f2)
f3 = verification(f3)
f4 = verification(f4) f2() #此处f2即inner的函数地址,执行f2()其实执行的是inner()
上述代码中,我们增加了四局代码,使我们能够在不修改原码的情况下,对程序进行了扩充,并且没有改变其他部门使用人的习惯,很好的解决了问题,这种方法其实就是装饰器的原理。我们进行简单的修改就能够更加好看和美观。
def verification(func):
#验证模块
def inner():
print("请输入你的账号和密码进行验证")
func()
return inner @verification #f1 = verification(f1)
def f1():
print(666) @verification #等价于f2 = verification(f2)
def f2():
print(777) @verification #f3 = verification(f3)
def f3():
print(888) @verification #f4 = verification(f4)
def f4():
print(999) f2() #此处f2即inner的函数地址,执行f2()其实执行的是inner()
上面代码中,我们应用了装饰器@,也实现了与上面代码一样的功能,其实函数f1上面的装饰器@verification等价于f1 = verification(f1)这句话,让我们在进行函数之前,首先执行验证代码块,由于verification(f1)是执行验证函数,此时用户还没有调用,但是函数已经执行,为了不让函数执行验证模块,我们增加了一层函数嵌套,在第二层进行嵌套,第一层的作用是返回第二层嵌套函数的函数名,以便在用户输入调用的时候在进行调用,所以用户在调用的时候,输入f2()其实等于执行了函数inner()。此时inner()函数也激活了,在python内存中存在。
因此,如果我们不想某层函数执行的话,就给函数嵌套一层函数,返回第一层函数的函数名,在第二层进行执行。我们也可以给函数增加参数,要知道是那个函数在执行命令。
给函数传递参数,给函数传递一个参数,由于我们知道,用户调用f2()的时候,其实运行的是inner(),因此inner()的参数与func()一样多。下面我们来给装饰器传递一个参数。
def verification(func):
#验证模块
def inner(name):
print("请输入你的账号和密码进行验证")
func(name)
return inner @verification #f1 = verification(f1)
def f1(name):
print() @verification #等价于f2 = verification(f2)
def f2(name):
print(,name) @verification #f3 = verification(f3)
def f3(name):
print() @verification #f4 = verification(f4)
def f4():
print() f2("alex") #此处f2即inner的函数地址,执行f2()其实执行的是inner()
传递多组参数:
def verification(func):
#验证模块
def inner(*args,**kwargs):
print("请输入你的账号和密码进行验证")
func(*args,**kwargs)
return inner @verification #f1 = verification(f1)
def f1(name):
print(666) @verification #等价于f2 = verification(f2)
def f2(name):
print(777,name) @verification #f3 = verification(f3)
def f3(name,age,*args):
print(888,name,age,args) @verification #f4 = verification(f4)
def f4():
print(999) f2("alex") #此处f2即inner的函数地址,执行f2()其实执行的是inner()
f3("alex","sb","is",333,222)
我们结合之前学习的动态参数*args,**kwargs可以给函数传递多个参数,这样能满足用户传入多个参数不会出错的情况。
上面代码运行结果如下:
请输入你的账号和密码进行验证
777 alex
请输入你的账号和密码进行验证
888 alex sb ('is', 333, 222)
我们给f3()传递了多个参数,但是系统并没有报错,而且正常接受了参数,可见使用*args,**kwargs能够接收多个参数,并且不同的函数即便函数的参数的个数不一致也没有关系。
装饰器就是为了给已经存在的函数扩展新的功能。
day4 装饰器深入解析的更多相关文章
- 小白的Python之路 day4 装饰器前奏
装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...
- 小白的Python之路 day4 装饰器高潮
首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...
- Day4 装饰器——迭代器——生成器
一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...
- day4装饰器
Python装饰器 1.必备 def foo(): print(foo) <function foo at 0x7f62db093f28> >>> foo <fun ...
- day4装饰器-迭代器&&生成器
一.装饰器 定义:本质是函数,(装饰其他函数)就是为其它函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数及“变量” 2.高阶 ...
- 装饰器、生成器,迭代器、Json & pickle 数据序列化
1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...
- 装饰器模式&&ES7 Decorator 装饰器
装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构.相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活. ...
- Python之旅Day5 列表生成式 生成器 迭代器 装饰器
装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...
- 函数和常用模块【day05】:装饰器高潮(三)
本节内容 1.概述 2.装饰器定义 3.装饰器定义 4.带参数的生成器 一.概述 我们之前介绍了大幅片的内容,感觉跟装饰器半毛钱关系都没有,其实不然,我们分别详细阐述了高阶函数和内置函数,下面我们就来 ...
随机推荐
- swagger2的常用注解,传递参数的注意使用方法
背景介绍: 刚开始的时候,在controller层使用@RequestParam的时候,发现这个参数是必须要输入值的,但是我们有时候必须查询的时候允许参数为空,使用这个注解就不行了. 在集成了swag ...
- AndroidManifest.xml 权限 中英对照表
声明: 1.本文转载自:http://www.52pojie.cn/thread-304613-1-1.html 2.如有转载请复制上面连接声明,尊重原创 常用权限对照表 android.permis ...
- [Java多线程]-线程池的基本使用和部分源码解析(创建,执行原理)
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 多线 ...
- 关于C#微信公众号开发的前言说明
本人是昨天开始接触微信公众号开发的,昨天看一天官方文档,基本上晕乎乎的,刚开始接触这个真的有点困难,特别是C#在这方面的资料不多,不如php java方面的资料全. 所以我准备每天写一点关于C#微信开 ...
- 关于 Capella 需要纠正的语音
li { font-size: 18px; } 关于 Capella 需要纠正的语音 持续更新 浊塞音声带要振动 区分 [θ]/[ð] 和 [t̪],注意舌位 [ɫ] 的舌位,切记不能圆唇 [æ] 的 ...
- dubbo可通过指定Url方式绕过注册中心直连指定的服务地址
开发.测试环境可通过指定Url方式绕过注册中心直连指定的服务地址,避免注册中心中服务过多,启动建立连接时间过长,如: <dubbo:reference id="providerServ ...
- Web 开发者不可不知的15条编码原则
HTML 已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家 ...
- 应用于网站导航中的 12 个 jQuery 插件
当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...
- phpcms模板
cms的样式有很多种,我们学习的是phpcms,这些cms都是大同小异,学会了一种就可以使用其它的cms. PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性 ...
- windows下启动mysql服务的命令行启动和手动启动方法
1.图形界面下启动mysql服务. 在图形界面下启动mysql服务的步骤如下: (1)打开控制面板->管理工具->服务,如下图所示: 可以看到Mysql服务目前的状态是未启动(未写已启动的 ...