python装饰器菜鸟教程,python中装饰器的定义
本文主要介绍python decorator的代码分析。文章分享的内容包括decorator的一般模型和一些要点。通过实例的详细介绍,有参考价值,有需要的朋友可以参考一下。
00-1010 1.装饰者的一般模型2。多个装饰器的函数执行3。带参数的装饰者4。班级装饰者
目录
定义包装(fn):
def inner(*args,**kwargs):
ret=fn(*args,**kwargs)
返回ret
返回内部
装饰器几个关键点:
1.函数可以作为参数传递。2.函数可以作为返回值返回。3.函数名可以被赋值为变量。装饰器本质上是闭包,在不改变原来的函数调用的情况下,给函数添加新的函数。
举个例子:
国防行政(游戏):
Def inner (* args,* * kwargs) : # inner添加了参数,args必须是元组kwargs必须是字典
打印(“开放工作组”)
Result=game (* args,* * kwargs) # * *表示args元组和kwargs分散成位置参数,传入关键字参数。
打印(“关闭工作组”)
回送结果
返回内部
@admin
def play_dnf(用户名,密码):
打印(f 开始玩DNF,账号: {用户名},密码3360 {密码} )
印刷(“刀割肉,心割魂”)
还‘掉:元的哭炮’
@admin
def play_wow(种族,职业,服务器_名称,阵营):
打印(f 开始玩魔兽世界,种族:{race},职业3360 {occupation},服务器3360 {server _ name},营地3360 {camp} )
印刷品(“为了辛多雷的荣耀”)
返回掉了:的灰烬使者
if __name__==__main__:
Ret1=play_dnf(大马猴, 88888 )
打印(返回1)
Ret2=play_wow(血精灵,圣骑士,回声山,部落)
打印(返回2)
这段代码很容易理解,所以我就不解释了,然后是执行结果如下:.
python demo.py
开放工作组
开始玩DNF,账号:密码:88888。
刀割肉,心割魂。
关闭工作组
滴:屠杀法哼哼唧唧的枪。
开放工作组
开始玩魔兽世界,种族:血精灵,职业:圣骑士,服务器:回声山,营地:部落。
为了辛多雷的荣耀
关闭工作组
掉落:灰烬使者
进程结束,退出代码为0
1.装饰器通用模型
一个函数被多个装饰器装饰,又将如何执行呢?
定义包装器1(fn):
def inner(*args,**kwargs):
打印(“这是w1条目”)
ret=fn(*args,**kwargs)
打印(“这是w1输出”)
返回ret
返回内部
定义包装器2(fn):
def inner(*args,**kwargs):
打印(“这是w2条目”)
ret=fn(*args,**kwargs)
打印(“这是w2输出”)
返回ret
返回内部
@wrapper1
@wrapper2
定义目标():
打印(“我是目标”)
if __name__==__main__:
目标()
直接给出执行顺序:
由多个装饰者装饰的函数的执行顺序。
# w1 w2目标w2 w1
2.多个装饰器装饰的函数执行
装饰器的语法允许我们在调用时提供其他参数,比如@decorator(a)。这样就为decorators的编写和使用提供了更多的灵活性。
(上面设置了另一层功能)
例如,我们可以在装饰器中指定日志级别,因为不同的业务功能可能需要不同的日志级别。
定义使用记录(级别):
定义装饰器(功能):
def包装(*args,**kwargs):
如果level==warn:
logging.warn(%s正在运行 % func。__name__)
elif级别==info:
logging.info(%s正在运行 % func。__name__)
返回函数(*参数)
返回包装
返回装饰者
@use_logging(level=warn )
def foo(name=foo):
打印(“我是% s“% name”)
foo()
3.带参数的装饰器
没错,decorator不仅可以是函数,也可以是类。与函数装饰器相比,类装饰器具有很大的灵活性、高内聚性和封装性。使用类装饰器主要依赖于类的__call__方法,当装饰器使用@ form附加到一个函数时调用该方法。
类Foo(对象):
def __init__(self,func):
自我。_func=func
def __call__(self):
打印(“类装饰器运行”)
自我。_func()
打印(“类装饰结束”)
@Foo
定义栏():
打印(“条形”)
酒吧()
这就是关于python装饰器代码分析的这篇文章。关于python decorator的更多信息,请搜索热门IT软件开发工作室之前的文章或者继续浏览下面的相关文章。希望你以后能支持风行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。