装饰器

  • 什么是装饰器?:在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上
  • Python中的装饰器是你进入Python大门的一道坎;

装饰器特点:

  1. 不改变原函数原代码;
  2. 不改变原函数调用方式;
  3. 给原函数增添新的功能;

示例:

def deco(func):
def wrapper(*args,**kwargs):
print ("add new function")
func()
return wrapper @deco #相当于func1=deco(func1)
def func1():
print('hello world')

讲解:

首先:了解函数func 与 func()的区别?

  1. func为函数的内存id
  2. 内存id+()既可以运行函数--->func()

示例:

def func1():
print('hello world')
print(func1)
.....运行结果
<function func1 at 0x000000834651FBF8>

其次:变动一下装饰器函数并分析他干了些什么

按代码运行顺序进行分析

#第一步:
def deco(func):
def wrapper():
print ("add new function")
func()
return wrapper
#第二步
def func1():
print('hello world')
#第三步
func2=deco(func1)
#第四步
func2()

第一步:定义deco函数

第二步:定义func1函数

第三步

①调用deco函数并将func1()函数的内存id以实参传入deco函数

②deco 函数动作一:定义wrapper()函数,wrapper函数内容:

print ("add new function")

使用实参func1=func,即:func1()

注意:wrapper函数只定义,未运行;

③deco函数动作二:返回wrapper函数内存id

④将deco()函数的返回值传递给变量func2 即func2=<function deco..wrapper at 0x0000001A66577048> 即func2=wrapper

第四步:func2()即wrapper()

print ("add new function")

func1()

最后,到了这里我们就大体了解了装饰器的工作原理了,我们再回看前面的装饰器就不难理解啦

其中:Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。


拓展:带参数的装饰器

def default_engine(engine=None):
def auth(func):
def deco(*args, **kwargs):
user = input('user:')
password = input('password:')
if engine == 'mysql':
if user == 'root' and password == 'root':
res = func(*args, **kwargs)
return res
else:
print('用户名或密码错误')
else:
print('没有这个引擎')
return deco
return auth @default_engine(engine='mysql')
def index():
print('welcome to home page') # res = default_engine(engine='mysql')
# index = res(index)
index()

最新文章

  1. 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
  2. Git 本地项目上传至托管平台(OsChina/GitHub)
  3. visual studio 调试时遇到 System.BadImageFormatException
  4. 查询数据库中表或视图或存储过程的数量 sql 语句
  5. 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
  6. C#后台代码编写图片地址Properties.Resources._1;
  7. ASP.NET vNext or .NET vNext?
  8. homebrew常用命令
  9. Java微信公众平台开发_06_素材管理
  10. block,inline,inline-block的区别
  11. 深入理解Python的字符编码
  12. Python中的转义
  13. CORS跨域 Ajax headers 问题
  14. nginx主配置文件详解
  15. JavaScript代理模式
  16. easyUI中textbox或number的数值大小校验
  17. 安卓高手之路之ClassLoader(二)
  18. 如何理解java泛型类
  19. LeetCode: Pascal&#39;s Triangle 解题报告
  20. IDEA的基本配置

热门文章

  1. eclips如何安装jetty插件
  2. 九个最容易出错的 Hive sql 详解及使用注意事项
  3. Openstack neutron 网络服务 (七)
  4. requests +httprunne r
  5. MBAir下安装httprunner2.5.7 har2case 出现zsh: command not found解决方案
  6. 【ORA】 ORA-01031:权限不足的问题
  7. [Usaco2016 Dec]Moocast
  8. Spring入门及IoC的概念
  9. 前端知识(二)04-vue-element-admin-谷粒学院
  10. vue原生文件上传,可以多文件上传