ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20210108 装饰器详解

2021-04-07 15:55:25  阅读:210  来源: 互联网

标签:test1 test2 函数 详解 time 20210108 装饰 def


装饰器:
定义:
本质是函数,功能是用来装饰其他函数,就是为其他函数添加附加功能(器是函数的意思,本质是用来装饰的)
原则:1. 不能修改被装饰的函数的源代码2. 不能修改被装饰的函数的调用方式# 装饰器,对被装饰的函数是完全透明的1-1def test1():passdef test2():passtest1()
test2()

test1 和 test2 都有自己要完成的功能,现在要把 test1 和 test2 新增加一个记录日志的功能
应该如何操作?1-1-1以前的做法,把代码一段一段的加进去def test1():passprint('logging')def test2():passprint('logging')

test1()
test2()1-1-2学了函数之后,高级了一些;单独定义一个函数def logger():print('logging')def test1():passlogger()def test2():passlogger()

test1()
test2()1-1-3假如有 100 个函数,已经运行在生产环境当中
有一天产品经理说,要对app新增一个功能,应该怎么做?找到100个函数,每一个都加上去?
但是你的程序已经运行了,这种修改源代码的操作,意味着会有风险发生
所以,新增一个功能,不能够修改函数的源代码,函数一旦写好了,原则上是不能动源代码的
因此,函数的调用方式也不能修改
实现装饰器知识储备:1. 函数即“变量”2. 高阶函数3. 嵌套函数

高阶函数+嵌套函数 => 装饰器1-1# 一个统计函数运行时间的装饰器import timedef test1():
    time.sleep(3)print('in the test1')

test1()1-2# 现在写一个装饰器# 一个统计函数运行时间的装饰器import timedef timmer(func):def warpper(*args,**kwargs):
        start_time=time.time()
        func()
        stop_time=time.time()print('the func run time is %s'%(stop_time-start_time))return warpper# 装饰器本质就是一个函数# 那么装饰器怎么用?@timmerdef test1():
    time.sleep(3)print('in the test1')

test1()--->in the test1
the func run time is 3.0002810955047607# 对 test1 来说,是完全感知不到 timmer 的存在的
1-1# 什么是嵌套函数?# 在函数体内在用 def 定义另外一个函数def foo():print('in the foo')def bar():print('in the bar')
    
    bar()
foo()--->in the fooin the bar# bar() 是一个局部变量,存在于过程或者函数中;函数即变量# 局部变量不能在外面调用,只能在内部调用# 所以,如果要调用 bar(),应该写在内部
1-1-1# 以下情况是函数嵌套吗?# 如果 test2 存在,这种方式叫函数嵌套吗?# 这叫函数调用,不是嵌套def test1():
    test2()

test1()# 装饰器是由嵌套函数和高阶函数组成
2-1局部作用域和全局作用域的访问顺序 

x=0 
def grandpa():# x=1 def dad():
        x=2 def son(): 
            x=3 print(x)
        son() 
    dad() 
grandpa() 

# grandpa 函数中 套了两个函数,如果想运行 son;一定要通过 dad 进行调用# 所以写 dad()调用的目的,是为了运行 son()# 如果不写 dad(),调用 grandpa() 时,会有什么效果?# 遇到 def 相当于定义一个变量,如果没有调用 dad(),后面相当于没有变量,相当于什么事情都没有做# 作用域一层一层,从内向外寻找

 

标签:test1,test2,函数,详解,time,20210108,装饰,def
来源: https://blog.51cto.com/15149862/2690360

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有