装饰器知识

Posted 美梦恋黑夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器知识相关的知识,希望对你有一定的参考价值。

装饰器:

定义:本质上还是函数(功能:装饰其他的函数)也就是说:为其他函数添加附加功能

原则:1、不能修改被装饰函数的源代码

2、不能修改被装饰函数的调用方式

总结:也就是说被修改的函数感知不到装饰器的存在,因为没有动函数的运行

实现装饰器知识储备:

1、函数即“变量”

2、高阶函数

3、嵌套函数

高阶函数 + 嵌套函数==》装饰器

1、函数即变量

 

通过del只是删除掉了门牌号,因为每过一段时就会刷新一次,看那些变量没有被利用就会回收内存。比如;x=1一直被利用就永远不会被清空,除非用del来进行清理变量名,当一段时间刷新时,发现没有门牌号 1没有被引用才会清理掉

 

Python是通过查找变量名字,如果找不到之后,才会将其中的1删掉  这就是python中的内存回收机制(门牌号没有的情况下会清除掉内容)

 

其中的lambda x:x*3是可以直接被回收的,可以通过calc = lambda x:x*3 定义一个门牌号

 

2、高阶函数

 

a:把一个函数当做实参传递给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

 

b:  返回值中包含函数名(不修改函数的调用方式)

 

  1 装饰器:
  2 
  3 定义:本质上还是函数(功能:装饰其他的函数)也就是说:为其他函数添加附加功能
  4 
  5 原则:1、不能修改被装饰函数的源代码
  6 
  7 2、不能修改被装饰函数的调用方式
  8 
  9 总结:也就是说被修改的函数感知不到装饰器的存在,因为没有动函数的运行
 10 
 11 实现装饰器知识储备:
 12 
 13 1、函数即“变量”
 14 
 15 2、高阶函数
 16 
 17 3、嵌套函数
 18 
 19 高阶函数 + 嵌套函数==》装饰器
 20 
 21 1、函数即变量
 22 
 23 
 24 
 25 
 26 通过del只是删除掉了门牌号,因为每过一段时就会刷新一次,看那些变量没有被利用就会回收内存。比如;x=1一直被利用就永远不会被清空,除非用del来进行清理变量名,当一段时间刷新时,发现没有门牌号 1没有被引用才会清理掉
 27 
 28 
 29 Python是通过查找变量名字,如果找不到之后,才会将其中的1删掉  这就是python中的内存回收机制(门牌号没有的情况下会清除掉内容)
 30 
 31 
 32 其中的lambda x:x*3是可以直接被回收的,可以通过calc = lambda x:x*3 定义一个门牌号
 33 
 34 
 35 2、高阶函数
 36 
 37 
 38 a:把一个函数当做实参传递给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
 39 
 40 
 41 b:  返回值中包含函数名(不修改函数的调用方式)
 42 
 43 
 44 # 匿名函数
 45 # calc = lambda x:x*3
 46 # print(calc) #输出为   <function <lambda> at 0x0127C660> 内存地址
 47 # #函数即变量
 48 # 方法1:
 49 # def bar():
 50 #     print(\'in the bar\')
 51 # def foo():
 52 #     print(\'in the foo\')
 53 #     bar()
 54 # foo()
 55 # 方法2:
 56 # def foo():
 57 #     print(\'in the foo\')
 58 #     bar()
 59 # def bar():
 60 #     print(\'in the bar\')
 61 # foo()
 62 #高阶函数
 63 # def bar():
 64 #     print("in the bar")
 65 # def test1(func):
 66 #     print(func)
 67 #     func()
 68 # func =bar   #函数即变量 将函数bar当做一个变量赋给函数func
 69 # test1(bar)
 70 
 71 # import time
 72 # def bar ():#被修饰的函数
 73 #      time.sleep(3)
 74 #      print("in the bar")
 75 # def foo(func):#
 76 #     first_time =time.time()
 77 #     func()#运行被修饰的函数
 78 #     stop_time=time.time()
 79 #     print("run the func is %s" %(stop_time-first_time))
 80 # foo(bar)
 81 
 82 
 83 import time
 84 def bar():
 85     time.sleep(3)
 86     print(\'in the bar\')
 87 def foo(func):
 88     first_time = time.time()
 89     func()#运行被修饰的函数
 90     stop_time=time.time()
 91     print("run the func is %s" %(stop_time-first_time))
 92     return func
 93 print(foo)
 94 bar =foo(bar)#python 解释器中有专门的符号来处理 “=” 并且功能相同
 95 bar()#相当于不修改函数的调用方式
 96 #foo(bar)
 97 
 98 # import time
 99 # def bar():
100 #     time.sleep(3)
101 #     print(\'in the bar\')
102 # def test2(func):
103 #     print(func)
104 #     return func
105 # bar =test2(bar)
106 # bar()
107 
108 
109 
110 
111 
112 
113 
114  
View Code

 

3、嵌套函数

1 在函数内部以def进行开始的函数
2 Eg:  def test1():
3     print(\'in the test1\')
4     def bar():  #函数的嵌套
5         print(\'in the bar\')
6     bar()#函数的调用
7 test1() 

局部作用域和全局作用域的访问顺序

 1 x =0
 2 def  A():
 3     x =1
 4     def B():
 5         x =2
 6         def C():
 7             x =3
 8             print(x)
 9         C()
10     B()
11 A()
View Code

 

以上是关于装饰器知识的主要内容,如果未能解决你的问题,请参考以下文章

1.16 Python基础知识 - 装饰器

装饰器知识

Python-基础知识-装饰器

Python小知识点--装饰器

零碎知识点:装饰器MD5异常日志

Python基础知识之装饰器