余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

python函数装饰器基础

xiyangw 2023-10-09 16:13 26 浏览 0 评论

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('梯阅线条')
 装饰器例子
 梯阅线条

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

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

相关推荐

“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意...

面试官问:三次握手与四次挥手是怎么完成的?

作者|饶全成来源|码农桃花源记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有...

三次握手和四次挥手的高阶面试题,建议收藏

昨天村长的讲解,真是一语点醒,这样的解释胜过死记硬背。但对于学习者,如果不能有直观感受,可能还是觉得不接地气,今天介绍两个工具,一个是网络抓包工具Wireshark,一个是linux命令tcpdum...

三次握手和四次挥手到底是个什么鬼东西

之前总有是有面试官喜欢问,你知道什么是三次握手么?什么是四次挥手么?为什么握手需要三次,挥手需要四次呢?今天我们就来详细的聊一下这个。1.什么是TCPTCP协议,简单称呼一下的话,那就是传输控制协议,...

加深理解TCP的三次握手与四次挥手

在了解三次握手和四次挥手之前,先要知道TCP报文内部包含了那些东西。熟悉了解TCP报文对日后学习网络和排除方面有很大的帮助,所以,今天为了加深对三次握手的理解,从新去认识TCP报文格式。TCP报文格式...

三次握手 与 四次挥手_三次握手四次挥手大白话

三次握手:①首先Client端发送连接请求报文②Server段接受连接后回复ACK报文,并为这次连接分配资源。③Client端接收到ACK报文后也向Server段发生ACK报文...

动画讲解TCP的3次握手,4次挥手,让你一次看明白

专注于Java领域优质技术,欢迎关注作者:老钱占小狼博客TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本篇尝试...

linux下实现免密传输文件或登录到其他服务器

使用scp传输文件到其他服务器的时候,提示需要输密码,如下:[root@18csetup]#scpLINUX.X64_180000_db_home.zip192.168.133.120:/u0...

Linux如何通过salt免密SCP传输上百台机的脚本?看chatGPT的回答

如何通过salt免密SCP传输上百台机的shell脚本”,下面是chatGPT给出的结果。scp批量免密脚本给出的详细shell脚本如下:#!/bin/bash#源文件路径和目标路径SRC_...

Linux/Mac scp命令上传文件_将hdfs上的文件下载到本地的命令是

语法scp[可选参数]file_sourcefile_target参数说明:-1:强制scp命令使用协议ssh1-2:强制scp命令使用协议ssh2-4:强制scp命令只使用IPv4寻...

Linux常用功能——文件远程传输_linux 远程传输文件

scp是securecopy的简写,是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,用于在Linux下进行远程拷贝文件的命令。和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器...

使用 scp 命令定时拉取服务器备份文件

我们的服务器,每周五必须要做下备份,但总是忘记执行备份这件事情,或者是服务器备份做了,但没有做异地备份。所以通过定时任务自动备份,备份成功之后,在其它服务器上面通过定时任务scp命令自动拉取备份文...

windows下最轻便的FTP/SCP文件管理器

这次推荐的工具叫做winscp,这个工具如果是IT从业人员,又是做服务端相关工作的话,可能无人不知,如果是刚入门,推荐立马上手试试。如果看了觉得有用,欢迎收藏、点赞、关注。官方网站:https://w...

我不是网管 - Linux中使用SCP命令安全复制文件

SCP是linux发行版中的命令行工具,用于通过网络安全地跨系统复制文件和目录。SCP代表安全复制,因为它使用ssh协议复制文件。拷贝时,scp命令建立ssh连接到远程系统。换句话说...

WinSCP软件双系统(Win-Linux)文件传输教程

WinSCP软件是windows下的一款使用ssh协议的开源图形化SFTP客户端,也就是一个文件传输的软件,它有什么优点吗,咱们嵌入式开发中经常会将windows中的文件复制到linux系统当中,比较...

取消回复欢迎 发表评论: