python-@函数装饰器

  例如@classmethod,@staticmethod的本质就是函数装饰器,其中,classmethod和staticmethod都是python的内置函数

  使用@引用已有的函数后,可用于修饰其他函数,装饰被修饰的函数。我们可以开发自定义的函数装饰器

  装饰的过程可以分为

  1. 将被修饰的函数作为参数传递给@符号引用的函数
  2. 将被修饰的函数换成装饰函数的返回值

代码实例

 1 def funA(fu):
  2     print("a")
  3     fu()#执行被传入的参数
  4     return "b"
  5 @funA
  6 def funb():
  7     print("c")
  8 print(funb)
  9 """
 10 程序的运行过程:
 11 1.将funb作为参数传递给装饰函数funA,也就是@funA相当于执行的funA(fu    nb)
 12 2.将funb替换成装饰函数的返回值
 13 """                  

运行结果

a
c
b
  通过这个例子,我们已经对装饰器的执行关系有了一定的了解和认识。可能有人认为,被修饰的函数已经变成了字符串。

注意:

  被修饰的函数总是被替换成函数装饰器的返回值,因此被修饰的函数会变成怎么样完全由函数修饰器的返回值来决定的

代码示例:

14 def jiugongge(fu):                                                 
 15     def do():
 16         num = int(input())
 17         a = [[0 for i in range(num)]for i in range(num)]
 18 #将第一行中间那列的值定为1
 19         a[0][num//2] = 1
 20         x = 0
 21         y = num//2
 22 #将2以后的值依次填入列表中
 23         for i in range(1,num*num):
 24             j = i + 1
 25             x = x - 1
 26             y = y + 1
 27             if x < 0 and y <= num - 1:
 28                 x = x + 3
 29                 a[x][y] = j
 30             elif x < 0 and y > num - 1:
 31                 x = x + 2
 32                 y = y - 1
 33                 a[x][y] = j
 34             elif y > num - 1:
 35                 y = 0
 36                 a[x][y] = j
 37             else:
 38                 if a[x][y] == 0:
 38                 if a[x][y] == 0:
 39                     a[x][y] = j
 40                 else:
 41                     x = x + 2
 42                     y = y - 1
 43                     a[x][y] = j
 44  
 45         for n in range(num):
 46             for m in range(num):
 47                 print(str(a[m][n]).rjust(2,"0"),end = "	")
 48             print()
 49     return do
 50 @jiugongge
 51 def funcation():
 52     print("funcation")
 53 funcation()                         

运行结果:

3
08      03      04
01      05      09
06      07      02
此时的funcation函数已经被替换成了do函数,应为修饰器函数的返回值是do函数
调用funcation其实就是在调用do函数

笨鸟先飞
原文地址:https://www.cnblogs.com/zoutingrong/p/13893213.html