Python---装饰器

Python的装饰器类似AOP编程思想。

假如现有函数f1,现在有一个新需求,执行f1要打印出现在时间

def f1():
    print('hello world')

f1()

一般做法:直接在f1函数内部直接加一行代码,这样显然是不行的,这样违反了修改是封闭的,对扩展是开放的的原则。要是有几十上百的函数有这样一个需求,那岂不是要修改几十上百个函数的内部代码?
还有做法,定义另外一个函数,把原来的函数作为参数传递给新函数

import time
def f1():
    print('hello world')

def print_current_time(func):
    print(time.time())
    func()

print_current_time(f1)

这样的做法调用另外一个函数来实现的,这样显然没有意义,和在f1内部加一行代码无异。
所以:就有了装饰器

需要定义一个嵌套函数

import time

def decorator(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper

def f1():
    print('Hello world!')

那怎么调用定义的嵌套函数呢?
一般方法:

f = decorator(f1)
f()

这样也不是调用的原来的函数,失去了本来意义。
装饰器的真正妙用在于:

直接在原来函数上面加上@符号加上定义的嵌套函数。最后只需要调用原来函数就可以。

import time

def decorator(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper

@decorator # 装饰器的真正妙用!
def f1():
    print('Hello world!')

f1()
------------------------
输出:
1535812696.6964784
Hello world!

这样调用原来的函数,没有 改变内部代码,就能实现新功能,这就是装饰器的妙用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值