• 深入理解python类装饰器和带参数装饰器


    装饰器wapper函数可以使用fun的参数,并且可以给fun传递不一样的参数
    def deco(func):
        def wrapper(a, b):
            print(a)
            startTime = time.time()
            c = a + 1
            func(c, b)
            endTime = time.time()
            msecs = (endTime - startTime) * 1000
            print("time is %d ms" % msecs)
    
        return wrapper
    
    
    @deco
    def func(a, b):
        print("hello,here is a func for add :")
        time.sleep(1)
        print("result is %d" % (a + b))
    
    
    if __name__ == '__main__':
        f = func
        f(3, 4)
        # func()


    使用装饰器处理异常

    多个装饰器从上到下执行
     1 #coding=utf-8
     2 
     3 
     4 def ioerror1(fun):
     5     def ioerror2(docment):
     6         try:
     7             fun(docment)
     8         except IOError:
     9             print("File is missing!")
    10     return ioerror2
    11 
    12 def valueerror1(fun):
    13     def valueerror2(docment):
    14         try:
    15             fun(docment)
    16         except ValueError:
    17             pass
    18     return valueerror2
    19 
    20 @ioerror1
    21 @valueerror1
    22 def said(docment):
    23     with open(docment) as data:
    24         for each_line in data:
    25             (role,spoken) = each_line.split(':',1)
    26             print(role,end='')
    27             print('said:',end='')
    28             print(spoken,end='
    ')
    29 
    30 said('E:pyHeadFirstPythonchapter3sketch.txt')

    装饰类函数,只要在内部函数添加self变量
     1 import os
     2 
     3 
     4 def excute_all(func):
     5     def wrapper(self, *args, **kwargs):
     6         xlsx_list = os.listdir(path='..//Data//')
     7         for xlsx in xlsx_list:
     8             if ".xlsx" in xlsx and "~" not in xlsx:
     9                 self.xlsx = xlsx
    10                 print("正在执行" + self.xlsx)
    11                 func(self, *args, **kwargs)
    12     return wrapper
    13 
    14 
    15 class TestSplit(object):
    16     def __init__(self):
    17         pass
    18 
    19     @excute_all
    20     def entrust(self):
    21         print(self.xlsx[:-5] + '.log')
    22 
    23 
    24 if __name__ == '__main__':
    25     a = TestSplit()
    26     a.entrust()

    参考:https://blog.csdn.net/xiangxianghehe/article/details/77170585
    http://www.cnblogs.com/sysnap/p/6599140.html

    装饰器带参数,函数带参数
     1 def get_db_info1(db_remark):
     2     def real_func(fun2):
     3         def handle_func(*args, **kwargs):
     4             print("$$$$$$$$$$$$db_name$$$$$$$$$$$$$", db_remark)
     5             kwargs["host"] = "10.139.60.156"
     6             kwargs["user"] = "user"
     7             kwargs["password"] = "password"
     8             fun2(*args, **kwargs)
     9 
    10         return handle_func
    11 
    12     return real_func
    13 
    14 
    15 @get_db_info1(db_remark="mysql156")
    16 def execute_sql_list2(*args, **kwargs):
    17     # print("###########sql#############", sql)
    18     print(kwargs['host'])
    19     print(kwargs['user'])
    20     print(kwargs["password"])
    21     for key in args:
    22         print(key)
    23 
    24 
    25 if __name__ == '__main__':
    26     execute_sql_list2("sql_list")

    参考:https://www.cnblogs.com/sysnap/p/6599140.html

       https://www.cnblogs.com/chaojiyingxiong/p/9223754.html



  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/carlvine/p/7489196.html
Copyright © 2020-2023  润新知