python中的装饰器

核心:在不影响原来函数的调用方式和结果的前提下,扩展他的功能

装饰器是修改其他函数功能的函数,装饰器有助用让我们的代码更短。

当您需要扩展您不想修改的函数的功能时,这是很理想的

例如:

def decor(func):
    def wrap(*args):
        print('________')
        func(*args)
        print('________')
    return wrap
def print_text(*args):
        print('hello world')
decorated=decor(print_text)
decorated()

#结果 ————————————
      hello world 
      ____________

我们定义了一个名为decor 的函数,他有一个单一的参数func。

在decor 中我们定义了一个名为wrap的嵌套函数。

wrap函数将打印一个字符串,然后调用func(),并打印另一个字符串。

我们可以说,装饰变量是print_text的装饰版本-他是print_text上加一些东西。

这是通过重新赋值包含我们的函数变量来完成的。

print_text=decor(print_text)
print_text()

上面这段代码很重要,不容易理解

他这莫做的意义在于   调用print_text函数的时候,不是执行

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

这个函数 ,而是执行

def decor(func):
    def wrap():
        print('________')
        func()
        print('________')
    return wrap

并把print_text这个函数作为参数  传给decor这个函数进行执行

最终我们在执行print_text这个函数时,它本身的调用方式没有变化,执行结果 也没有发生变化,也加入我们想加入的功能。

继续演变:

python为了简化,定义了一种方法

def decor(func):
    def wrap(*args):
        print('________')
        func(*args)
        print('________')
    return wrap

@decor
def print_text():
        print('hello world')

print_text()

#结果 ————————————
      hello world 
      ____________

就是在print_text定义这个函数之前,加入@decor     表示的意识就是把decor 函数作为print_text函数的装饰器 .

如果print_text需要传入参数,在定义装饰器的时候一定要   写成wrap(*args),这代表 你传入什么函数都行,都能接收。

一个函数可以有多个装饰器。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值