python装饰器详解 带参数,python装饰器详解@static
目录1装饰器定义2复习函数(学习装饰器的先决条件)2.1一切都是对象——函数2.2定义函数(嵌套函数)2.3从函数返回函数2.4将函数作为参数传递给另一个函数3第一个装饰器4高阶装饰器4.1判断是否用参数调用装饰器4.2装饰器。
1 Decorator定义Decorator本质上是一个Python函数,它允许其他函数添加额外的函数,而无需任何代码更改。装饰器的返回值也是一个函数对象。经常用在有截止需求的场景,比如日志插入、性能测试、事务处理、缓存、权限检查等等。Decorator是解决这类问题的优秀设计。有了decorator,我们可以提取大量与函数本身无关的相同代码,并继续重用它们。
2复习功能(学习decorator的先决条件)
2.1一切都是对象—— function def hi(name= yaso ob ):
返回“嗨”名
打印(高())
#输出:“你好,yasoob”
#我们甚至可以给变量赋值一个函数,比如
问候=嗨
#我们在这里没有使用括号,因为我们没有调用hi函数。
#它把它放在greet变量中。让我们试着运行这个。
print(greet())
#输出:“你好,yasoob”
#如果我们删除旧的hi功能,看看会发生什么!
德尔嗨
打印(高())
#输出:名称错误
print(greet())
#输出:“嗨,yasoob”
2.2在函数中定义函数(嵌套函数)def hi(name=yasoob ):
print(现在您在hi()函数中)
def greet():
返回“现在您在greet()函数中”
def欢迎():
返回“现在您在welcome()函数中”
print(greet())
打印(欢迎())
打印(“现在你又回到hi()函数中”)
嗨()
#output:现在你在hi()函数中
#现在你在greet()函数中
#现在你在welcome()函数中
#现在你回到了hi()函数中
#以上说明无论何时调用hi(),greet()和welcome()都会同时被调用。
#则greet()和welcome()函数在hi()函数之外是不可访问的,例如:
问候()
# outputs:name错误:未定义名称“greet”
2.3从函数中返回函数def hi(name=yasoob ):
def greet():
返回“现在您在greet()函数中”
def欢迎():
返回“现在您在welcome()函数中”
if name==yasoob :
回复问候
否则:
欢迎归来
a=嗨()
打印(一份)
#输出:
#上面清楚地显示了‘a’现在指向hi()函数中的greet()函数。
#现在试试这个
打印(a())
#outputs:现在你在greet()函数中
嗨()()
# outputs:现在你在if/else语句中的greet()函数中,我们返回greet和welcome,而不是greet()和welcome()。这是为什么呢?这是因为当你在后面放一对括号,这个函数就会执行;但是,如果你不在它后面加上括号,它就可以被传递并赋给其他变量,而不用执行它。
当我们写a=hi()时,将执行hi(),由于name参数默认为yasoob,因此返回函数greet。如果我们把语句改成a=hi(name="ali "),那么就会返回欢迎函数。我们还可以打印出hi()(),它将输出现在您在greet()函数中。
2.4将函数作为参数传递给另一个函数def hi():
回复“你好,yasoob!”
def doSomethingBeforeHi(func):
print(在执行hi()之前我正在做一些无聊的工作)
print(func())
doSomethingBeforeHi(嗨)
#outputs:在执行hi()之前,我正在做一些无聊的工作
#嗨yasoob!
3第一个装饰者(写过去的)是原型,Python版,2004年之前。
def a_new_decorator(a_func):
def wrapTheFunction():
print(在执行a_func())之前我在做一些无聊的工作
函数函数()
print(执行完a_func(),我在做一些无聊的工作)
返回wrapTheFunction
def a _ function _ required _ decoration():
打印("我是需要一些装饰来去除我的臭味的功能")
a _ function _ requiring _ decoration()
#输出:"我是需要一些装饰来去除我的臭味的函数"
a _ function _ required _ decoration=a _ new _ decorator
#现在一个_功能_需求_装饰被wrapTheFunction()包装了
a _ function _ requiring _ decoration()
#输出:在执行函数函数()之前,我正在做一些无聊的工作
#我是一个功能,需要一些装饰来消除我的臭味
#我在执行a_func()(现在写法)后面版本的计算机编程语言中支持了@语法糖
def a_new_decorator(a_func):
def wrapTheFunction():
打印(在执行a_func())之前我在做一些无聊的工作
函数函数()
打印(执行完a_func(),我在做一些无聊的工作)
返回wrappthefunction
@a_new_decorator
def a _ function _ required _ decoration():
打印("我是需要一些装饰来去除我的臭味的功能")
a _ function _ requiring _ decoration()
#输出:在执行函数函数()之前,我正在做一些无聊的工作
#我是一个功能,需要一些装饰来消除我的臭味
#我在执行函数函数()后做一些无聊的工作运行如下代码会存在一个问题:
打印(答)功能_需求_装饰__姓名_ _)
#输出:wrapTheFunction这并不是我们想要的!输出输出应该是一个_功能_需求_装饰。这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档(文档字符串).幸运的是计算机编程语言提供给我们一个简单的函数来解决这个问题,那就是functools.wraps。我们修改上一个例子来使用functools.wraps:
从函数工具导入包装
def a_new_decorator(a_func):
@ wrapps(a _ func)
def wrapTheFunction():
打印(在执行a_func())之前我在做一些无聊的工作
函数函数()
打印(执行完a_func(),我在做一些无聊的工作)
返回wrappthefunction
@a_new_decorator
def a _ function _ required _ decoration():
嘿哟!"装饰我!"
打印(我是需要一些装饰的功能
除去我的臭味)
打印(答)功能_需求_装饰__姓名_ _)
#输出:a _ function _ required _ decoration
四高阶装饰器
4.1 判断是否调用装饰器从函数工具导入包装
定义装饰者名称(f):
@ wrapps(f)
极好的装饰(*args,**kwargs):
如果不是可以运行:
返回"函数将不运行"
返回f(*args,**kwargs)
装饰返回
@decorator_name
定义函数():
返回("函数正在运行")
can_run=True
print(func())
#输出:功能正在运行
can_run=False
print(func())
#输出:功能将不运行
4.2 带参数的装饰器打出原木信息,而且还需指定原木的级别
定义日志记录(级别):
定义包装器(函数):
def inner_wrapper(*args,**kwargs):
打印[{level}]:输入函数{func}() .格式(
级别=级别,
函数=函数__姓名_ _)
return func(*args,**kwargs)
返回内部包装
返回包装
@日志记录(级别=信息)
极好的说(某事):
打印"说{}!"。格式化(某物)
# 如果没有使用@语法,等同于
# say=logging(level=INFO)(say)
@日志记录(级别=调试)
定义做(某事):
打印“做{ }……”。格式化(某物)
if __name__==__main__ :
说("你好")
做("我的工作")参考链接:https://www . run OOB . com/W3C note/python-func-decorators . html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。