Python-18_装饰器

"""
    装饰器
"""
"""
# 新增功能:
def print_func_name(func):
    print(func.__name__)

# 已有方法:
def say_hello():
    print("hello")
    print_func_name(say_hello)

def say_goodbye():
    print("goodbye")
    print_func_name(say_goodbye)

"""
# --------------在不改变原有功能代码以及调用功能代码的基础上,增加新功能----------

# ---------------------------第一步------------------------
# 新增功能:
def print_func_name(func):
    def wrapper():
        print(func.__name__)    # 新增功能
        return func()           # 原始功能
    return wrapper

# 已有方法:
def say_hello():
    print("hello")

def say_goodbye():
    print("goodbye")

# say_hello / say_goodbye 得到的是内嵌函数 wrapper
say_hello=print_func_name(say_hello)
say_goodbye=print_func_name(say_goodbye)

say_hello()
say_goodbye()

# ----------------------------第二部(无参数)------------------------
# 新增功能:
def print_func_name(func):
    def wrapper():
        print(func.__name__)
        return func()
    return wrapper

# 已有方法:
@print_func_name        # say_hello=print_func_name(say_hello)
def say_hello():
    print("hello")

@print_func_name        # say_goodbye=print_func_name(say_goodbye)
def say_goodbye():
    print("goodbye")

say_hello()
say_goodbye()

# 装饰器:目的:
#             拦截对被装饰方法的调用

# ----------------------------第三步(有参数)------------------------

# 新增功能:
def print_func_name(func):
    def wrapper(*args,**kwargs):
        print(func.__name__)
        return func(*args,**kwargs)
    return wrapper

# 已有方法:
@print_func_name
def say_hello(name):
    print(name,"hello")

@print_func_name
def say_goodbye(name):
    print(name,"goodbye")

say_hello("张三疯")
say_goodbye("小小")

# 装饰器链
# 一个函数可以被多个装饰器修饰,执行顺序为从近到远
练习 1:在现有功能是,增加验证权限
def verify_permissions(func):
    def wrapper(*args, **kwargs):
        print("验证权限")
        return func(*args, **kwargs)

    return wrapper


@verify_permissions
def enter_background():
    print("进入后台系统...")


@verify_permissions
def delete_order(order_id):
    print("删除订单", order_id)


enter_background()
delete_order(101)
练习 2:计算某个程序运行时间
import time


def timer(func):
    def wrapper(*args, **kwargs):
        time_start = time.time()
        result = func(*args, **kwargs)
        time_end = time.time()
        print("执行时间:%ds" % (time_end - time_start))
        return result

    return wrapper


@timer
def fun01():
    print("fun01")
    time.sleep(2)


@timer
def fun02():
    print("fun02")
    time.sleep(1.5)


fun01()
fun02()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值