码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器

时间:2019-02-11 16:52:37      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:一个   code   python   Python一   ret   增加   self   一句话   *args   

装饰器用一句话解释:把对象(函数)及其参数回调到已经给定对象里进行预处理。按照python一切皆对象的观点来看,就是把函数及其参数传到一个对象中进行装饰(处理),是一种对象的调用方式。
最简单的装饰器:

In [4]: def f2(fun): 
   ...:     def f1(): 
   ...:         res=fun()*2 
   ...:         return res 
   ...:     return f1 
   ...: @f2 
   ...: def fun(): 
   ...:     return 2 
   ...: a=fun() 
   ...: print(a)                                                                                                        
4

  

增加参数:

 1 def f2(fun):
 2     def f1(a,b):
 3         res=fun(a,b)*2
 4         return res
 5     return f1
 6 @f2
 7 def fun(a,b):
 8     return a+b
 9 df=fun(1,2)
10 print(df)

 


增加装饰器参数:

 1 def f3(c):
 2     def f2(fun):
 3         def f1(a,b):
 4             res=fun(a,b)*2+c
 5             return res
 6         return f1
 7     return f2
 8 
 9 @f3(4)
10 def fun(a,b):
11     return a+b
12 
13 df=fun(1,2)
14 
15 print(df)

 

参数高大上一点:

 1 def f3(c):
 2     def f2(fun):
 3         def f1(*args,**kwargs):
 4             res=fun(*args,**kwargs)*2+c
 5             return res
 6         return f1
 7     return f2
 8 
 9 @f3(4)
10 def fun(a,b):
11     return a+b
12 
13 df=fun(1,2)
14 
15 print(df)

 

class对象的装饰器:

class c:
    def __init__(self,fun):
        self.fun=fun
    def __call__(self):
        res=self.fun()*2
        return res

@c
def fun():
    return 2

df=fun()

print(df)

 

带参数的class对象装饰器:
class c:
def __init__(self,fun):
self.fun=fun
def __call__(self,*args,**kw):
res=self.fun(*args,**kw)
return res

@c
def fun(a,b):
return a+b
df=fun(1,2)
print(df)

@c#注意,传入的是c1这个对象,装饰器c的__call__函数里的参数是处理的f3里面的参数,需要和f3函数参数对应,实际上fun映射了c1
class c1():
def f3(self,a,b):
return a+b
df=c1().f3(1,2)
print(df)

class装饰器带参数
class C:
def __init__(self,a1=0):
self.a=a1
#pass
def __call__(self,fun):
def _call(*args,**kw):
res=fun(*args,**kw)*2*self.a
#print(res)
return res
return _call

class C1():
@C(6)
def f3(self,a,b):
return a+b

df=C1().f3(1,2)

print(df)

 

python装饰器

标签:一个   code   python   Python一   ret   增加   self   一句话   *args   

原文地址:https://www.cnblogs.com/hikingyu/p/10362203.html

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