码迷,mamicode.com
首页 > 编程语言 > 详细

【Python】装饰器

时间:2018-10-18 11:02:45      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:too   代码   name   def   功能   inner   port   log   UNC   

原函数

def foo():
    print(i am foo)

增加函数功能

def foo():
    print(i am foo)
    print(i am running)

不修改原函数代码的同时增加函数功能

def log(func):
    func()
    print(i am running)


def foo():
    print(i am foo)


log(foo)

函数名不变

foo = log(foo)
foo()

则需要返回一个函数

def log(func):
    def inner():
        func()
        print(i am running)
    return inner


def foo():
    print(i am foo)


foo = log(foo)
foo()

语法糖

def log(func):
    def inner():
        func()
        print(i am running)
    return inner


@log
def foo():
    print(i am foo)


foo()

原函数有参数

def log(func):
    def inner(a, b):
        func(a, b)
        print(i am running)
    return inner


@log
def foo(a, b):
    print(a, b)


foo(1, 2)

装饰器不用随着原函数的参数修改而修改

def log(func):
    def inner(*args):
        func(*args)
        print(i am running)
    return inner


@log
def foo(a, b):
    print(a, b)


foo(1, 2)

装饰器带参数

def outer(x):
    def log(func):
        def inner(*args):
            print(x)
            func(*args)
            print(i am running)
        return inner
    return log


@outer(0)
def foo(a, b):
    print(a, b)


foo(1, 2)

相当于

foo = outer(0)(foo)

函数名更正

def outer(x):
    def log(func):
        def inner(*args):
            inner.__name__ = func.__name__
            print(x)
            func(*args)
            print(i am running)
        return inner
    return log


@outer(0)
def foo(a, b):
    print(a, b)


foo(1, 2)

 更好的做法

import functools


def outer(x):
    def log(func):
        @functools.wraps(func)
        def inner(*args):
            print(x)
            func(*args)
            print(i am running)
        return inner
    return log


@outer(0)
def foo(a, b):
    print(a, b)


foo(1, 2)

 

【Python】装饰器

标签:too   代码   name   def   功能   inner   port   log   UNC   

原文地址:https://www.cnblogs.com/CoreCoder/p/9807871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!