码迷,mamicode.com
首页 > 其他好文 > 详细

py函数装饰器-s

时间:2020-12-15 12:26:11      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:报错   另一个   总结   ===   方法   username   style   open   可见   

函数装饰器:

概念:通过修改其他函数的功能,有助于让代码更简短 原则:已经实现了的功能代码,尽量不修改,对现有的代码进行扩展修改
例1:
def f():#假设一个函数f() return "helloworld" #这是默认返回值 print(f()) #调用f()函数并打印。 f1=f #将函数赋值给一个变量,这里没有使用f(),少了括号()的原因是因为这不是调用函数,
      #而是将函数f放到变量f1里面
print(f1()) #然后来打印一下变量f1的结果,可见f1()会返回函数f的返回值 #====结论:函数可以赋值给变量,通过调用变量,来调用函数


#例2: def f(): print("first,helloworld") def f1(): return "second,heloworld" def f2(): return "third,helloworld" print(f1()) print(f2()) print(f()) print(f1()) #===结论:函数可以嵌套函数,当函数被调用时,函数内部函数也默认调用并打印,
      #但是直接在函数外调用函数内部的函数却不行,会报错!!!



#例3: def f(username="qika",pwd="123456"): #给定默认参数username,pwd def f1(): #嵌套2个函数 return "f1,heloworld" def f2(): return "f2,helloworld" if username == "qika" and pwd =="123456": #判断一下:当username\pwd和默认相等即返回f1,
                              #不等或其他错误的都返回f2
return f1 #return f1() else: return f2 #return f2() print(f()) #调用默认的,就会默认传参是username="qika",pwd="123456",并返回f1(函数形式) print(f(11,1)) #传参不为username="qika",pwd="123456",(即传入和预期不符)那么就会返回f2(函数形式) #注意!!!:当上面调用f1\f2时,会返回函数,当调用的函数返回值是f1(),f2(),那么就会返回这两个函数下的返回值 #======结论:函数嵌套函数,也可以直接返回函数,也可以返回函数内部的函数的返回值;(多层)

#例4: def f(): return "first,helloworld" def f2(arg): print("second,helloworld") print("这里打印调用一下:传递进来当做函数参数的函数:{0}".format(arg()))
f2(f)#直接将上一个函数的函数名传入下一个函数的内当做参数。
#看懂了吗?简单直白一点: def f3(): print("返回值first") def f4(func): func() f4(f3) #调用:将函数名直接当做函数参数传递使用 #=====结论:函数可以当做参数进行传递使用,方法:将函数名当做参数,直接传递进下一个函数内即可 =====================================================================
以上,装饰器的简单语法总结! 后面还有函数的内置装饰器介绍:https://www.cnblogs.com/QiKa/p/13532042.html







装饰器使用:
++++++++++++++++++++++++++++++++++++++++++++++++++++++ #=============1、使用多个装饰器========== def f(func):#定义函数f print(enter f, func) def f1(): print(running f1) func() return f1 def a(func):#定义函数a print(enter a, func) def a1(): print(running,a1) func() return a1 @f #使用两个装饰器f和a: @a def main(): print(running main) if __name__ == __main__: main() #结论:装饰器可对一个函数使用多个: # 函数main()先被a装饰,变成新的函数,变成另一个函数后,再次被 f 装饰器修饰,不过执行函数是从上至下来的 #===========2、装饰器带参数===================== def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == "warn": logging.warn("%s is running" % func.__name__) elif level == "info": logging.info("%s is running" % func.__name__) return func(*args) return wrapper return decorator @use_logging(level="warn") #装饰器带参数 def foo(name=foo): print("i am %s" % name) foo() # #结论: # 实际上是对原有装饰器的一个函数封装,并返回一个装饰器。可以将它理解为一个含有参数的闭包函数 # 当使用装饰器:@use_logging(level="warn")调用时,Py自动发现这一层的封装,并把参数传递到装饰器的环境中。 # 即:@use_logging(level="warn") 等价于 @decorator,参数会默认传递进入

 

py函数装饰器-s

标签:报错   另一个   总结   ===   方法   username   style   open   可见   

原文地址:https://www.cnblogs.com/QiKa/p/14111105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!