python函数装饰器

装饰器(Decorators)

是 Python 的一个重要部分。

简单地说:他们是修改其他函数的功能的函数。

他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。

首先,让我们讨论下如何写你自己的装饰器。

这可能是最难掌握的概念之一。

我们会每次只讨论一个步骤,这样你能完全理解它。

1.一切皆对象

def func(name='duoceshi'):
    return 'hello' + name

print(func())
输出:hello duoceshi

#将函数传递给一个变量
variable = func
print(variable) 
输出: <function func at 0x000001DD9F7E7048> #函数对象
print(variable()) #带括号打印
输出:hello duoceshi

del func
print(func)
输出:NameError: name 'func' is not defined

print(variable())
输出:hello duoceshi

2.在函数中定义函数

def func():
    
    print('welcome to 多测师')
    
    def func1():
         
        print('welcome to 深圳多测师')
    
    def func2():
        
        print('welcome to 广州多测师')
    
    func1()
    func2()

func()
输出:
welcome to 多测师
welcome to 深圳多测师
welcome to 广州多测师
#无论何时调用func(),func1()和func2()都会被调用
#func1()与func2()在func()函数外是不会被调用的

func1()
输出:NameError: name 'func1' is not defined

3.从函数中返回函数

def func(name='多测师'):
    
    return 'welcome to 多测师'
    
    def func1():
         
        return 'welcome to 深圳多测师'
    
    def func2():
        
        return 'welcome to 广州多测师'
    
    if name == '多测师':
        return func1
            
    else:
        return func2

variable = func()
print(variable)
输出:<function func.<locals>.func1 at 0x00000157A166CD08>

print(variable())
输出:welcome to 深圳多测师

4.讲函数做为参数传给另一个函数

def func():
    return 'welcome to 多测师'

def func1(name):
    print('welcome to 深圳多测师')
    print(name())

func1(func)
输出:
welcome to 深圳多测师
welcome to 多测师

5.创建一个装饰器

def func(name):

    def func1():
        name()
        print('我是函数的新功能')

    return func1

def function():
    print('welcome to 多测师')

#直接调用第二个函数
# function()
#输出:
# welcome to 多测师

#传统调用方法
variable = func(function)
variable()
输出:
welcome to 多测师
我是函数的新功能

6.使用@符调用装饰器

def func(name):

    def func1():
        name()
        print('我是函数的新功能')

    return func1

@func
def function():
    print('welcome to 多测师')


function()
输出:
welcome to 多测师
我是函数的新功能

 

上一篇:Linux线程概念引入及编程实现


下一篇:global、nonlocal