装饰器

装饰器

def hello():
    print("Hello world")
    
hello()
Hello world
f = hello
f()
Hello world
# f和hello是一个函数
print(id(f))
print(id(hello))

print(f.__name__)
print(hello.__name__)
2550992906848
2550992906848
hello
hello
# 现在有新的需求:
# 对hello功能进行扩展,每次打印hello之前打印当前系统时间
# 而实现这个功能又不能改动现有代码
# ==>使用装饰器

装饰器(Decrator)

  • 在不改动函数代码的基础上无限扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
  • 装饰器的使用:使用@语法,即在每次要扩展到函数顶以前使用@+函数名
# 对hello函数进行功能扩展,每次执行hello前打印当前时间

import time

# 高阶函数,以函数作为参数
def printTime(f):
    def wrapper(*args,**kwargs):
        print("Time: ",time.ctime())
        return f(*args,**kwargs)
    return wrapper
# 上面定义了装饰器,使用的时候需要用到@,此符号是python的语法糖
@printTime
def hello():
    print("Hello world")
    
hello()
Time:  Wed Nov  6 15:58:03 2019
Hello world
# 装饰器的好处是,一旦定义,则可以装饰任意函数
# 一旦被其装饰,则把装饰器的功能直接添加到定义函数的功能上

@printTime
def hello2():
    print("asdadadasdsa")
    print("真累")
    
hello2()
Time:  Wed Nov  6 16:02:19 2019
asdadadasdsa
真累
# 上面对函数的装饰使用了系统定义的语法糖
# 下面开始手动执行装饰器
# 先定义函数

def hello3():
    print("手动执行装饰器")
    
hello3()

hello3 = printTime(hello3)
hello3()

f = printTime(hello3)
f()

# 问题:f()结果为什么会打印两个时间出来?
手动执行装饰器
Time:  Wed Nov  6 16:45:52 2019
手动执行装饰器
Time:  Wed Nov  6 16:45:52 2019
Time:  Wed Nov  6 16:45:52 2019
手动执行装饰器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值