Python 函数装饰器--最全面的详细的装饰器文章

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。 首先,让我们讨论下如何写你自己的装饰器。

这可能是最难掌握的概念之一。我们会每次只讨论一个步骤,这样你能完全理解它。

一切皆对象
首先我们来理解下 Python 中的函数:

def hi(name=“yasoob”):
return "hi " + name

print(hi())

output: ‘hi yasoob’

我们甚至可以将一个函数赋值给一个变量,比如

greet = hi

我们这里没有在使用小括号,因为我们并不是在调用hi函数

而是在将它放在greet变量里头。我们尝试运行下这个

print(greet())

output: ‘hi yasoob’

如果我们删掉旧的hi函数,看看会发生什么!

del hi
print(hi())
#outputs: NameError

print(greet())
#outputs: ‘hi yasoob’
在函数中定义函数
刚才那些就是函数的基本知识了。我们来让你的知识更进一步。在 Python 中我们可以在一个函数中定义另一个函数:

def hi(name=“yasoob”):
print(“now you are inside the hi() function”)

def greet():
    return "now you are in the greet() function"

def welcome():
    return "now you are in the welcome() function"

print(greet())
print(welcome())
print("now you are back in the hi() function")

hi()
#output:now you are inside the hi() function

now you are in the greet() function

now you are in the welcome() function

now you are back in the hi() function

上面展示了无论何时你调用hi(), greet()和welcome()将会同时被调用。

然后greet()和welcome()函数在hi()函数之外是不能访问的,比如:

greet()
#outputs: NameError: name ‘greet’ is not defined
那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数。现在你需要再多学一点,就是函数也能返回函数。

从函数中返回函数
其实并不需要在一个函数里去执行另一个函数,我们也可以将其作为输出返回出来:

def hi(name=“yasoob”):
def greet():
return “now you are in the greet() function”

def welcome():
    return "now you are in the welcome() function"

if name == "yasoob":
    return greet
else:
    return welcome

a = hi()
print(a)
#outputs: <function greet at 0x7f2143c01500>

#上面清晰地展示了a现在指向到hi()函数中的greet()函数
#现在试试这个

print(a())
#outputs: now you are in the greet() function
再次看看这个代码。在 if/else 语句中我们返回 greet 和 welcome,而不是 greet() 和 welcome()。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。 你明白了吗?让我再稍微多解释点细节。

当我们写下 a = hi(),hi() 会被执行,而由于 name 参数默认是 yasoob,所以函数 greet 被返回了。如果我们把语句改为 a = hi(name = “ali”),那么 welcome 函数将被返回。我们还可以打印出 hi()(),这会输出 now you are in the greet() function。

将函数作为参数传给另一个函数
def hi():
return “hi yasoob!”

def doSomethingBeforeHi(func):
print(“I am doing some boring work before executing hi()”)
print(func())

doSomethingBeforeHi(hi)
#outputs:I am doing some boring work before executing hi()

hi yasoob!

现在你已经具备所有必需知识,来进一步学习装饰器真正是什么了。装饰器让你在一个函数的前后去执行代码。

你的第一个装饰器
在上一个例子里,其实我们已经创建了一个装饰器!现在我们修改下上一个装饰器,并编写一个稍微更有用点的程序:

def a_new_decorator(a_func):

def wrapTheFunction():
    print("I am doing some boring work before executing a_func()")

    a_func()

    print("I am doing some boring work after executing a_func()")

return wrapTheFunction

def

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值