python基础十一之装饰器进阶

本文介绍了Python中函数的双下划线方法,包括如何使用__name__和__doc__获取函数名称和注释信息。深入探讨了装饰器的概念,特别是如何使用@wraps保持被装饰函数的原始名称,并介绍了带参数的装饰器以及多个装饰器装饰同一个函数的应用场景。

  函数的双下划线方法

def hahahha():
    """测试函数"""
    print('zxc')
print(hahahha.__name__)   # 打印函数的名字
print(hahahha.__doc__)   # 打印函数中的注释

  wraps

  被装饰函数的名字在使用装饰器后名字对应的内存地址会发生变化,通过__name__打印的名字将不再是函数自身的名字,为了解决这个问题,就要用wraps

from functools import wraps
def func(fun):
    @wraps(fun)   # 使被装饰的函数的名字不发生变化
    def inner(*args, **kwargs):
        print('前面功能')
        ret = fun(*args, **kwargs)
        print('后面功能')
        return ret
    return inner
@func
def out():
    print('zxc')
print(out.__name__)

    

  带参数的装饰器

# 带参数的装饰器
import time
# FLAG = True
FLAG = False


def timmer_out(flag):
    def timmer(func):
        def inner(*args, **kwargs):
            if flag:
                start = time.time()
                ret = func(*args, **kwargs)
                end = time.time()
                print(end-start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timmer

# timmer_out(FLAG) 相当于timmer 所以@timmer_out(FLAG)就相当于@timmer


@timmer_out(FLAG)
def test():
    time.sleep(1)
    print('zxc')


@timmer_out(FLAG)
def test1():
    time.sleep(1)
    print('zxf')

test()
test1()
View Code

  

  多个装饰器装饰一个函数

# 多个装饰器装饰一个函数


def wrapper1(f):
    def innner():
        print('wrapper1装饰的func之前')
        f()
        print('wrapper1装饰的func之后')
    return innner


def wrapper2(f):
    def innner():
        print('wrapper2装饰的func之前')
        f()
        print('wrapper2装饰的func之后')
    return innner


@wrapper2
@wrapper1
def func():
    print('func')
func()

 

转载于:https://www.cnblogs.com/zxc-Weblog/p/8145359.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值