暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

函数装饰器基础

原创 梯阅线条 2023-12-22
131

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 "<pyshell#2>", line 1, in <module> f1.f2 AttributeError: 'function' object has no attribute 'f2' >>> f1().f2 Traceback (most recent call last): File "<pyshell#3>", 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('梯阅线条') 装饰器例子 梯阅线条

2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

文章转载自梯阅线条,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论