最简单的模板是这样的

1 #-*-coding:utf-8-*-

2

3 def outer(func):

4 def inner():

5 print 'before'

6 func()

7 print 'after'

8 # return r

9 return inner

10 '''

11 def outer_1(func):

12 def inner():

13 print 'before 11'

14 func()

15 print 'after 22'

16 # return r

17 return inner

18

19 @outer_1

20 '''

21 @outer

22 def F1():

23 print 'test'

24

25 if __name__ == '__main__':

26 F1()

27 '''

28 运行结果

29 before

30 test

31 after

32 [Finished in 0.1s]

33 '''

View Code

--装饰器也能用2个,把注释打开

函数带多个参数,装饰器对应修改以适合多种情况

1 # -*- coding: utf-8 -*-

2

3 from time import ctime

4 from time import sleep

5

6 def ftfunc(func):

7 def timef(*s,**gs):

8 print "[%s] %s() called" % (ctime(),func.__name__)

9 return func(*s,**gs)

10 return timef

11

12 @ftfunc

13 def foo(*s,**gs):

14 print(s)

15 print(gs)

16

17 if __name__ == '__main__':

18 foo()

19 foo(1)

20 foo(1,2)

21 foo(1,2,3)

22 stu = {'name' : 'alam' ,'age' :12}

23 foo(1,2,3,**stu)

24 '''

25 运行结果

26 [Wed Jun 14 15:49:55 2017] foo() called

27 ()

28 {}

29 [Wed Jun 14 15:49:55 2017] foo() called

30 (1,)

31 {}

32 [Wed Jun 14 15:49:55 2017] foo() called

33 (1, 2)

34 {}

35 [Wed Jun 14 15:49:55 2017] foo() called

36 (1, 2, 3)

37 {}

38 [Wed Jun 14 15:49:55 2017] foo() called

39 (1, 2, 3)

40 {'age': 12, 'name': 'alam'}

41 [Finished in 0.1s]

42

43 '''

View Code

函数带多个参数,装饰器也带多个参数

1 # -*- coding: utf-8 -*-

2

3 def decrator(*dargs, **dkargs):

4 def wrapper(func):

5 def _wrapper(*args, **kargs):

6 print "decrator param:", dargs, dkargs

7 print "function param:", args, kargs

8 return func(*args, **kargs)

9 return _wrapper

10 return wrapper

11

12 @decrator(1, a=2)

13 def foo(x, y=0):

14 print "foo", x, y

15

16

17 if __name__ == '__main__':

18 foo(3, 4)

19

20 '''

21 执行结果

22 decrator param: (1,) {'a': 2}

23 function param: (3, 4) {}

24 foo 3 4

25 [Finished in 0.1s]

26 '''

View Code

 函数带多个参数,装饰器能转换参数类型

1 # -*- coding: utf-8 -*-

2

3 def validate(**vkargs):

4 def decorator(func):

5 def wrapper(**kargs):

6 for key in vkargs:

7 # 根据vkargs中的参数的类型对kargs的参数进行类型转换

8 kargs[key] = vkargs[key](kargs[key])

9 return func(**kargs)

10 return wrapper

11 return decorator

12

13

14 @validate(x=int, y=float, z=float)

15 def move(x, y, z):

16 print "move %d (%0.2f, %0.2f)"%(x, y, z)

17

18

19

20 if __name__ == '__main__':

21 move(x="1", y="0.2", z="0.3")

22 '''

23 运行结果

24 move 1 (0.20, 0.30)

25 [Finished in 0.2s]

26 '''

View Code

 一个简单的例子,登录页面

1 # -*- coding: utf-8 -*-

2

3 #模拟网站登陆访问认证

4

5 name = 'abc'

6 password='123'

7

8 def certi(model):#装饰器

9 def outr(fun):#装饰器加参数需要多加一层嵌套

10 def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数

11 if model=='password':

12 print('enter password')

13 user_name = raw_input('user_name ').strip()

14 paswd=raw_input('password ').strip()

15 if user_name==name and paswd==password:

16 print('pass')

17 return fun(*args,**kwargs)

18 else:

19 print('error ')

20 exit()

21 elif model=='lamp':

22 print('this is lamp')

23 return fun(*args,**kwargs)

24 else:

25 print('error')

26 return login

27 return outr

28

29

30 def indxe():

31 print('home page !!')

32

33 @certi(model='password')

34 def user():

35 print('user page !!')

36

37 @certi(model='lamp')

38 def bbs(name):

39 print('bbs %s!!'%name)

40

41

42

43 if __name__ == '__main__':

44 indxe()

45 user()

46 bbs(name='yjj')

47 '''

48 运行结果

49 home page !!

50 enter password

51 user_name abc

52 password 123

53 pass

54 user page !!

55 this is lamp

56 bbs yjj!!

57 '''

View Code

 -----------------20170711 再次理解-----------------

1.简单的装饰器

 

2.带参数的装饰器

 3.多个装饰器

 

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。