函数装饰器基础

1 函数装饰器基础

1.1 函数调用

描述

根据之前文章《python函数属性和注解》得知,python函数定义时生成函数对象并赋值给了函数名。

调用方式:

(1)直接调用方式为:通过函数名+圆括号()调用函数,比如f1()。

(2)将函数名赋值给一个变量后,通过变量名()进行间接调用。

(3)将函数作为入参传给另一个函数后,在另一个函数内部调用。

示例

>>> def echo(msg):
    print(msg)

#直接调用函数 
>>> echo('直接调用')
直接调用
#赋值给其他变量,间接调用
>>> c=echo
>>> c('间接调用')
间接调用
>>> def indirect(func,arg):
    func(arg)
#作为入参   
>>> indirect(echo,'作为函数入参调用')
作为函数入参调用

1.2 嵌套函数

描述

函数f1内部定义函数f2,这就定义了一个嵌套函数。

通过之前文章《python作用域基础知识》得知,函数外是不可直接访问函数内部的变量的(因为函数执行完后函数内部变量就释放消失了),所以,如果需要调用内部函数f2,则需要将f2返回。

def f1():
    def f2():
        pass
    return f2

示例1

函数外不可访问函数内变量

>>> def f1():
    X='梯阅线条'
    def f2():
        print(X)
>>> f1.f2
Traceback (most recent call last):
  File "", line 1, in <module>
    f1.f2
AttributeError: 'function' object has no attribute 'f2'
>>> f1().f2
Traceback (most recent call last):
  File "", line 1, in <module>
    f1().f2
AttributeError: 'NoneType' object has no attribute 'f2'

示例2

函数内部调用嵌套的内部函数。

>>> def f1():
    X='梯阅线条'
    def f2():
        print(X)
    f2()
>>> f1()
梯阅线条

示例3

返回内部函数后,在外面调用内部函数。

>>> def f1():
    X='梯阅线条'
    def f2():
        print(X)
    return f2
>>> f3=f1()
>>> f3()
梯阅线条

1.3 函数装饰器基础

用法

# 定义一个嵌套函数(闭包函数)
def my_decorator(func): # 将被装饰的函数作为入参
    def my_wrapfunc(*args,**kargs):
        pass    # 做一些额外逻辑处理进行装饰
        func(*args,**kargs) # 调用被装饰的函数
        pass    # 做一些额外逻辑处理进行装饰
    return my_wrapfunc  # 返回内部函数供外面继续调用被装饰的函数
def f1(msg):
    pass
# 调用
f1=my_decorator(f1)
f1(msg)

描述

函数装饰器也是一个函数,它对被装饰的函数进行调用,并且做一些额外的逻辑处理。不改变被装饰函数的原有逻辑。

函数装饰器是一个嵌套函数,

(1)定义一个入参用于接收被装饰的函数;

(2)定义一个内部函数,并且返回这个内部函数,供外面函数调用;

(3)内部函数实现额外逻辑处理,并且调用被装饰函数的函数;

示例

>>> def my_decorator(func):
    def my_wrapfunc(*args,**kargs):
        print('装饰器例子')
        func(*args,**kargs)
    return my_wrapfunc

>>> def f1(msg):
    print(msg)
>>> f1=my_decorator(f1)
>>> f1('梯阅线条')
装饰器例子
梯阅线条

1.4 函数装饰器使用@

用法

# 定义一个嵌套函数(闭包函数)
def my_decorator(func): # 将被装饰的函数作为入参
    def my_wrapfunc(*args,**kargs):
        pass    # 做一些额外逻辑处理进行装饰
        func(*args,**kargs) # 调用被装饰的函数
        pass    # 做一些额外逻辑处理进行装饰
    return my_wrapfunc  # 返回内部函数供外面继续调用被装饰的函数
@my_decorator   # 相当于 f1=my_decorator(f1)
def f1(msg):
    pass
# 调用
f1(msg)

描述

直接在函数定义def上面一行用“@装饰器函数名”即可。

比如,

@my_decorator

def f1**(msg):pass**

相当于 f1=my_decorator(f1)

调用时,直接调用被装饰函数名即可。

示例

>>> def my_decorator(func):
    def my_wrapfunc(*args,**kargs):
        print('装饰器例子')
        func(*args,**kargs)
    return my_wrapfunc
>>> @my_decorator
def f1(msg):
    print(msg)
>>> f1('梯阅线条')
装饰器例子
梯阅线条

你可能感兴趣的:(python,python)