Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86887
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-12 22:31
文章分类

全部博文(26)

文章存档

2016年(26)

我的朋友

分类: Python/Ruby

2016-12-09 15:59:46

装饰器


一,装饰器必备知识


1,
def f1():
print("123")


def f1():
print(456)


f1()   #在执行f1()函数时,会把上面一个f1函数给覆盖掉

结果:
456


2,
def f1():
print(123)


def f2(xxx):
xxx()
    
f2(f1)   #此时f2中的xxx就相当于f1,看清是f1整体,而不是f1(),
#说明函数可以作为一个参数传递函数
 


二,装饰器流程剖析



def outer(func): #装饰器函数
def inner():
print("ok")
func()
print("no")
return inner




@outer
def f1():
print("F1")

f1()


装饰器的核心总结:

@ + 函数名
功能:1,自动执行outer函数,并将其下面的函数(f1,f2,f3)作为参数传递
 2,将outer函数的返回值,重新赋值给f1,覆盖了原来f1。
 
应用场景:在不改变原函数的情况下,统一增加新的功能和操作。



三,装饰器流程剖析之返回值



def outer(func): #装饰器函数
def inner():
print("ok")
r = func() #不能直接返回return r,因为return之后的不行执行
print("no") #会导致后来的操作失效,这是一个完整的装饰器。
return r
return inner


@outer
def f1():
print("F1")
return "hello world"

f1()


如果下面的函数又返回值时,装饰器也必须加返回值。



四,装饰器流程剖析之参数

1,一个参数
def outer(func): #装饰器函数
def inner(a): #----->加上参数a
print("ok")
r = func(a) #----->加上参数a
print("no")
return r
return inner


@outer
def f1(args): #注意原函数有参数的时候,inter函数也必须有
print("args")
return "hello world"

f1()


注意:参数的问题


2,一个混合多个参数的问题
def outer(func): #装饰器函数
def inner(*args,**kwargs):
print("ok")
r = func(*args,**kwargs)
return r
return inner


@outer
def f1(args): #注意原函数有单个参数的时候,inter函数也必须有
print("args")
return "hello world"


@outer
def f2(*args,**kwargs): #注意原函数有多个参数的时候,inter函数也必须有
print("args,kwargs")
return "hello world"

小结:不管inner函数中传的是万能参数。至于下面引用装饰器的函数(如f1,f2...)里面有一个参
数还是多个参数,Python内部会进行自动判断,有一个参数,就传一个,有多个就传多个。

总结:上面所述都是普通的装饰器,在实际工作中多用于权限的验证。

阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~