python装饰器学习记录 2018-04-25

1.最近在大佬的blog上发现我们的装饰器除了可以用来进行统计日志还能帮我们抓异常,这样脚本也能非常的美观(偷懒),可以杜绝满屏的try....except的情况(不考虑性能)

import functools
def catch_func_error(func):
    '''
    函数的报错的装饰器,
    :param func:
    :return:
    '''
    @functools.wraps(func)
    def warpper(*args,**kwargs):
        try:
            result=func(*args,**kwargs)
            return result
        except Exception as e:
            print('do_something_on_error')
            # self.do_something()
    return warpper

def deafult_error():
    pass

def catch_class_error(funcname=''):
    '''
    在类报错中使用,可以调用类中的其他方法进行处理,如果不存在则不处理
    :param funcname:
    :return:
    '''
    def decorator(func):
        @functools.wraps(func)
        def warpper(self,*args,**kwargs):
            try:
                result = func(*args, **kwargs)
                return result
            except Exception as e:
                # self.do_something()
                # 第一种处理手段,当没有对应的方法时执行一个默认的报错函数(我自己写的)
                getattr(self,funcname,deafult_error)()
                # 第二种处理方式,不用增加额外的函数
                # if hasattr(self,funcname):
                #     return getattr(self, funcname)()
        return warpper
    return decorator

class A():
    def do_something(self):
        print('报错了')

    # @catch_error
    @catch_class_error()
    def on_error(self):
        print(1/0)

A().on_error()


出处!大佬博客

2.动态创建不同的类,

def make_class(class_name):
    class C():
        def print_class_name(self):
            print(class_name)
    C.__name__=class_name
    return C

c1,c2= list(map(make_class,['c1','c2']))

c1=c1()
print(c1,'实例')
print(c2,'类')

你可能感兴趣的:(python装饰器学习记录 2018-04-25)