Python的装饰器,python装饰器--原来如此简单
本文主要详细介绍python decorator代码。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。
装饰器通用模型
定义包装(fn):
def inner(*args,**kwargs):
ret=fn(*args,**kwargs)
返回ret
返回内部
装饰器几个关键点
1.函数可以作为参数传递。
2.该函数可以作为返回值返回。
3.函数名可以被赋值为变量。
Decorator本质上是一个闭包。
在不改变原始函数调用的情况下,向函数中添加新函数。
举个例子
#!/usr/bin/python
国防行政(游戏):
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
一个函数被多个装饰器装饰,又将如何执行呢?
#!/usr/bin/python
定义包装器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
带参数的装饰器
装饰器的语法允许我们在调用时提供其他参数,比如@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()
类装饰器
没错,decorator不仅可以是函数,也可以是类。与函数装饰器相比,类装饰器具有很大的灵活性、高内聚性和封装性。使用类装饰器主要依赖于类的__call__方法,当装饰器使用@ form附加到一个函数时调用该方法。
类Foo(对象):
def __init__(self,func):
自我。_func=func
def __call__(self):
打印(“类装饰器运行”)
自我。_func()
打印(“类装饰结束”)
@Foo
定义栏():
打印(“条形”)
酒吧()
总结
本文到此为止。希望能帮到你,也希望你能多关注更多热门IT软件开发工作室的内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。