柠檬班python全栈自动化11期_python自动化装逼指南1------装饰器详解

2023-10-14 03:59

本文主要是介绍柠檬班python全栈自动化11期_python自动化装逼指南1------装饰器详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章由柠檬班Python全栈自动化学员

重庆--圆滚滚童鞋分享的一篇技术共享文章。

话不多说,直接上文章

一. 装饰器原则:1. 不能修改被装饰函数的源代码2. 不能修改被装饰函数的调用方法

二. 知识储备

1. 函数及变量

2. 高阶函数(满足一个即可)

2.1 函数名做函数实参

# import time

# def bar():

# time.sleep(3)

# print('in the bar')

#

# def test1(func):

# start_time=time.time()

# func() #run bar

# stop_time=time.time()

# print("the func run time is %s" %(stop_time-start_time))

#

# test1(bar)

# bar()

可以实现在不改变源代码的情况下,为函数添加功能,但是改变了函数的调用方式

2.2 函数返回值中包含函数名

import time

def bar():

time.sleep(3)

print('in the bar')

def test2(func):

print(func)

return func

# print(test2(bar))

bar=test2(bar)

bar() #run bar

实现了直接通过bar(),不改变函数的调用方式,增加函数的功能

3. 嵌套函数

在一个函数的函数体内,用def去声明一个函数,而不是其调用他

def grandpa():

x = 1

def dad():#在这里只是声明了一个函数,但是没有调用他,所以最后什么都不打印

x =2

def son():

x = 3

print(x)

son()

#dad()

grandpa()640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

三. python的内存回收机制:

python的解释器中有一个引用计数的概念,python通过这个引用机制来实现内存的回收

四. 匿名函数

calc = lambda x:x*3

print(calc(3))

#结果为9

匿名函数没有函数名,声明后会立马被回收掉,但是将其赋值给一个变量之后,就不会被立马回收掉

五. 装饰器演化进程

1. 利用嵌套函数、高阶函数实现装饰器

1.1

import time

def deco(func):

def timer():

start_time = time.time()

func()

end_time = time.time()

print("\033[32;1mthe func runs %s"%(end_time-start_time))

return timer

def test1():

time.sleep(1)

print("in the test1")

test1 = deco(test1)

test1()640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

这种方式多了test1=deco(test1)的步骤

1.2 python@语法糖

python解释器提供了一个语法糖,来代替test1 = deco(test1)的功能

import time

def deco(func):

def timer():

start_time = time.time()

func()

end_time = time.time()

print("\033[32;1mthe func runs %s"%(end_time-start_time))

return timer

@deco#等于是执行了test1 = deco(test1)

def test1():

time.sleep(1)

print("in the test1")

test1()640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

1.3 带参数装饰器实现

但是上面的装饰器只是适用于无参函数,对于有参函数就会报错,要想实现对带参函数实现装饰器功能,需要在装饰器函数中带上参数,注意@test就是执行了test1=deco(test1),实际上是执行了嵌套的timer函数,所以在timer函数中带*args,**kwags参数,就可以实现利用装饰器修饰所有的带参以及不带参函数

import time

def timer(func):

def deco(*arg, **kwargs):

start_time = time.time()

func(*arg, **kwargs)

end_time = time.time()

print("\033[34;1mthe func runs %s"%(end_time-start_time))

return deco

@timer #等于是执行了test1 = timer(test1)

def test1():

time.sleep(0.5)

print("in the test1")

@timer

def test2(name):

time.sleep(0.5)

print("in the test2", name)

test1()

test2("gupan")640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

1.4 python装饰器实现选择执行

如果遇到遇到如下的场景,对于一个网站来说,如果是用户普通的登陆,只需要调用本地的认证服务器进行判断,如果涉及到充值等金钱相关业务,就需要调用第三方的认证接口,进行身份信息的验证,这就需要在定义引用装饰器的时候就传入参数@deco(auth_type = "local"),但是在讲解装饰器时,我们看到,函数第一层已经传入了函数名作为参数,第二层传入业务函数的参数,这样就需要我们再添加一层

python的解释器对@语法糖作出如下规定如果@deco(auth_type="lcoal"),"local"传入了最外面一层,第二层传入其修饰的函数的函数名,第三层传入了其所修饰函数实参

import time

user,passwd = 'alex','abc123'

def auth(auth_type):#先传入auth_type参数

print("auth func:",auth_type)

def outer_wrapper(func):#传入所修饰函数的函数名

def wrapper(*args, **kwargs):#传入函数被装饰函数实参

print("wrapper func args:", *args, **kwargs)

if auth_type == "local":

username = input("Username:").strip()

password = input("Password:").strip()

if user == username and passwd == password:

print("\033[32;1mUser has passed authentication\033[0m")

res = func(*args, **kwargs) # from home

print("---after authenticaion ")

return res

else:

exit("\033[31;1mInvalid username or password\033[0m")

elif auth_type == "ldap":

print("搞毛线ldap,不会。。。。")

return wrapper

return outer_wrapper

def index():

print("welcome to index page")

@auth(auth_type="local") # home = wrapper()

def home():

print("welcome to home page")

return "from home"

@auth(auth_type="ldap")

def bbs():

print("welcome to bbs page")

index()

print(home()) #wrapper()

bbs()

这篇关于柠檬班python全栈自动化11期_python自动化装逼指南1------装饰器详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207982

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1