python --装饰器通俗讲解
2024-09-07 23:46:44
装饰器
- 什么是装饰器?:在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上
- Python中的装饰器是你进入Python大门的一道坎;
装饰器特点:
- 不改变原函数原代码;
- 不改变原函数调用方式;
- 给原函数增添新的功能;
示例:
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()的区别?
- func为函数的内存id
- 内存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()
最新文章
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
- Git 本地项目上传至托管平台(OsChina/GitHub)
- visual studio 调试时遇到 System.BadImageFormatException
- 查询数据库中表或视图或存储过程的数量 sql 语句
- 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
- C#后台代码编写图片地址Properties.Resources._1;
- ASP.NET vNext or .NET vNext?
- homebrew常用命令
- Java微信公众平台开发_06_素材管理
- block,inline,inline-block的区别
- 深入理解Python的字符编码
- Python中的转义
- CORS跨域 Ajax headers 问题
- nginx主配置文件详解
- JavaScript代理模式
- easyUI中textbox或number的数值大小校验
- 安卓高手之路之ClassLoader(二)
- 如何理解java泛型类
- LeetCode: Pascal&#39;s Triangle 解题报告
- IDEA的基本配置
热门文章
- eclips如何安装jetty插件
- 九个最容易出错的 Hive sql 详解及使用注意事项
- Openstack neutron 网络服务 (七)
- requests +httprunne r
- MBAir下安装httprunner2.5.7 har2case 出现zsh: command not found解决方案
- 【ORA】 ORA-01031:权限不足的问题
- [Usaco2016 Dec]Moocast
- Spring入门及IoC的概念
- 前端知识(二)04-vue-element-admin-谷粒学院
- vue原生文件上传,可以多文件上传