zoukankan      html  css  js  c++  java
  • 装饰器的使用

     1 #使用装饰器 完成不修改func1() func2()函数的源码,添加输出日志信息
     2 import time 
     3 def func1():
     4     print('功能1')
     5 def func2():
     6     print('功能2')
     7 def writelog(func):
     8     try:
     9         file = open('log.txt','a',encoding='utf-8')
    10         file.write('访问:')
    11         file.write(func.__name__)
    12         file.write('	')
    13         file.write('时间:')
    14         file.write(time.asctime())
    15         file.write('
    ')
    16     except Exception as e:
    17         print(e.args)
    18     finally:
    19         file.close()
    20 
    21 #使用闭包
    22 def funcOut(func):
    23     def funcIn():
    24         writelog(func) #内部函数使用外部函数的变量
    25         func()
    26     return funcIn #外部函数返回内部函数的函数名
    27 
    28 #闭包的调用
    29 func1 = funcOut(func1) #调用外部函数,用一个变量接收返回的内部函数名
    30 """
    31 分析:左边 func1 变量(可以是其他变量名)  指向参数为func1的外部函数的返回值,
    32       也就是指向外部函数返回的内部函数的函数名
    33       此时,左边func1 和 funcIn 均指向内部函数。
    34 """
    35 
    36 #装饰器
    37 @funcOut #相当于 func1 = funcOut(func1),由此可见,装饰简化实现闭包的功能
    38 def func1(): # 将func1作为外部函数funcOut()的参数
    39     print('功能1')
    40 
    41 @funcOut # 装饰器的作用:简化闭包的调用
    42 def func2():
    43     print('功能2')
    44 
    45 func1() #用装饰器后,func1直接调用funcOut().并直接以func1作为参数执行内部函数
    46 func2()
    47 
    48 """
    49 总结:装饰器:将其下的函数名 func1 作为外部函数的变量参数运行,内部函数又使用
    50       外部函数的变量 func1 ,会执行:writelog(func1),func1()
    51 """
    1 功能1
    2 功能2
    1 访问:func1    时间:Sat May 16 17:49:21 2020
    2 访问:func1    时间:Sat May 16 17:50:18 2020
    3 访问:func1    时间:Sat May 16 18:05:37 2020
    4 访问:func1    时间:Sat May 16 18:07:18 2020
    5 访问:func2    时间:Sat May 16 18:07:18 2020
    6 访问:func1    时间:Sat May 16 18:16:50 2020
    7 访问:func2    时间:Sat May 16 18:16:50 2020
    正是江南好风景
  • 相关阅读:
    机器视觉资料整理
    《用TCP/IP进行网络互连》读书笔记
    Win Form不能响应键盘事件
    C语言 字符串前加L的意义 如:L“A”
    UniCode 下 CString 转 char* 的方法(转)
    BATCH
    HALCON不支持的设备中,获取图像
    关于FragmentManager动态管理Fragment时Fragment生命周期的探究
    关于如何惟一地标识一台Android设备的综合性讨论
    如何使ActionBar不那么单调
  • 原文地址:https://www.cnblogs.com/monsterhy123/p/12901632.html
Copyright © 2011-2022 走看看