Python装饰器初体验

Python装饰器初体验

学习Python过程中,装饰器是一个不太容易理解的点。首先来说一下个人的理解吧。

装饰器

装饰器是对原有函数对象的一个重写,并且指向原来的函数名以达到不需要大量重写就能增加函数功能的目的。

下面举一个简单的列子,定义一个简单的函数

def somefunc():
    print('Do Something!')

这时候,需要一个新的功能,我们需要这个函数的执行日志

import logging

def somefunc():
    print('Do something')
    logging.info('Func somefuc is running!')

显然,这是一个很不成熟的写法。一两个函数可以手动改动,什么阿猫阿狗函数都嚷着要加入豪华日志记录功能就麻烦了。
那么,就定义个函数专门来处理日志

def logging(goal_func):
    logging.warning(f'{goal_func.__name__} is running!')
    goal_func()
    
def rm_rf():
    print('删库跑路~')

只要把目标函数当做参数传入这个函数就OK

logging(rm_rf)
-------------------------------------
WARNING:root:rm_rf is running
删库跑路~

logging(goal_func)的形式不太直观了,没办法突出目标函数的主体,会增加代码的阅读难度。丑的一批~

这时候引入主角——装饰器

def logging_decorator(goal_func):
    def wrapper(*args, **kwargs):
        logging.warning('{} is running'.format(goal_func.__name__))
        return goal_func(*args, **kwargs)
    return wrapper
    
def fuck():
    print('富强民主~')
    
fuck = logging_decorator(fuck)
fuck()
---------------------------------------------
WARNING:root:fuck is runing
富强民主~

本质上,装饰器就是一个返回函数的高阶函数。在内部wrapper函数内添加新功能并和目标函数。
为了减少重复赋值的繁琐过程,引入了@语法糖去代替这个重新赋值定向的过程。下面的代码执行效果等同于上一代码块。

@logging_decorator
def fuck():
    print('富强民主~')

fuck()
---------------------------------------------
WARNING:root:fuck is runing
富强民主~
Last modification:May 13th, 2019 at 05:35 pm

Leave a Comment