美文网首页python遨游记
python装饰器进阶

python装饰器进阶

作者: Maql | 来源:发表于2017-06-28 16:59 被阅读22次

为什么要使用?

使用装饰器使代码变得整洁,并且能解决硬编码问题,使用起来也很方便,但是理解起来相对没那么容易,因此写下这篇文章加深理解。下面以记录日志的功能作为装饰器的讲解:

原始硬编码版

下面的logit作为装饰器,但是它只能装饰有两个参数的函数,因此是硬编码的。

def logit(func):
    def decorator(a, b):
        print("func %s is calling " % func.__name__)
        return func(a, b)
    return decorator

@logit()
def my_add(a, b):
    return a+b
  
my_add(1, 49)

可变参数版

使用*args, **kwargs将上述的硬编码去除,使得装饰器能装饰不同的函数

def logit(func):
    def decorator(*args, **kwargs):
        print("func %s is calling " % func.__name__)
        return func(*args)
    return decorator

wraps通用版

输出my_add.name发现函数的名称改变了,不是我们想要的my_add,因此使用wraps改造

print(my_add.__name__)
from functools import wraps
def logit(func):
    @wraps(func)
    def decorator(*args, **kwargs):
        print("func %s is calling " % func.__name__)
        return func(*args)
    return decorator

自定义参数版

有时候需要向装饰器来传递参数,例如不同的函数需要不同的日志文件时:

def logit(log_name="add.log"):
    def decorator(func)
        @wraps(func)
        def wrapper(*args, **kwargs):
            log_str = "func %s is calling " % func.__name__
            print(log_str)
            with open(log_name, "a") as log_file:
              log_file.write(log_str)
            return func(*args)
        return wrapper
    return decorator

相关文章

  • Python装饰器(Decorator)完全指南-进阶篇

    Decorator进阶指南 在[python装饰器完全指南基础篇中],我们已经知道了python中的装饰器本质上只...

  • Python装饰器-专题笔记

    学会装饰器,Python更进阶 函数作用域到闭包到装饰器讲解,及闭包和装饰器的运用。 [√] 慕课网Meshare...

  • Python中的装饰器

    本文的内容主要参考了《Python进阶》一书 装饰器(Decorators)是什么? 我理解的装饰器,主要是设计模...

  • Python进阶 装饰器

    一切皆对象 原始的装饰器 使用@的装饰器 蓝本规范 带参数的装饰器 装饰器类

  • python装饰器进阶

    为什么要使用? 使用装饰器使代码变得整洁,并且能解决硬编码问题,使用起来也很方便,但是理解起来相对没那么容易,因此...

  • Python进阶(装饰器)

    note 1:Python内置的@语法就是为了简化装饰器调用。下面两图效果一样。 note 2:python的de...

  • Python进阶 - 装饰器

    函数进阶知识 函数名只是一个指向函数的变量 在python中,一切皆对象。函数名只是一个指向函数的变量,为了验证这...

  • Python进阶-装饰器

    这篇文章要解决的问题: # 装饰器是什么? # 装饰器的种类? # 为什么使用装饰器? # 怎么使用装饰器? # ...

  • Python 装饰器

    最近在重新在学习 Python 进阶的内容。整理一下关于装饰器(decorator)的一些知识。在解释装饰器前,先...

  • python进阶—装饰器Decorator

    python装饰器是在函数调用之上的修饰,这些修饰是在声明或者定义一个函数的时候进行设置的。同时,装饰器是一个返回...

网友评论

    本文标题:python装饰器进阶

    本文链接:https://www.haomeiwen.com/subject/zvwucxtx.html