这篇文章由柠檬班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()

三. 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()

这种方式多了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()

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")

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自动化视频百度云_python自动化装逼指南1-装饰器详解相关推荐

  1. python百度云资源-Python开发视频百度云分享

    原标题:Python开发视频百度云分享 Python有很好的3D渲染库和游戏开发框架,有很多使用Python开发的游戏,如迪斯尼卡通城.黑暗之刃.常用PyGame.Pykyra等和一个PyWeek的比 ...

  2. python视频免费百度云-Python开发视频百度云分享

    原标题:Python开发视频百度云分享 Python有很好的3D渲染库和游戏开发框架,有很多使用Python开发的游戏,如迪斯尼卡通城.黑暗之刃.常用PyGame.Pykyra等和一个PyWeek的比 ...

  3. Python 装饰器详解(下)

    Python 装饰器详解(下) 转自:https://blog.csdn.net/qq_27825451/article/details/84627016,博主仅对其中 demo 实现中不适合pyth ...

  4. Python 装饰器详解(中)

    Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...

  5. Python 装饰器详解(上)

    Python 装饰器详解(上) 转自:https://blog.csdn.net/qq_27825451/article/details/84396970,博主仅对其中 demo 实现中不适合pyth ...

  6. python自动化测试 视频百度云_柠檬班python自动化测试开发课程

    柠檬班python自动化测试课程大纲 第1节_开学典礼 第2节_环境管理 第3节_编码规范 第4节_项目结构 第5节_元组和列表的原理和操作 第6节_字典和集合的原理和应用 第7节_推导式 第8节_迭 ...

  7. python装饰器详解-Python装饰器基础详解

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...

  8. python数据处理pdf百度云_Python数据处理 PDF 高清版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.数据.处理方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小12.0 MB,杰奎琳·凯泽尔编写,目前豆瓣.亚马逊. ...

  9. python自动化测试视频百度云-Python接口自动化测试 PDF 超清版

    给大家带来的一篇关于Python自动化相关的电子书资源,介绍了关于Python.接口自动化.测试方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小61.2 MB,王浩然编写,目前豆瓣.亚马 ...

最新文章

  1. matlab矢量相乘并打印显示
  2. linux下递归修改目录/文件权限命令
  3. Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接)
  4. 蓝牙模块与电脑无线通信--AD测量大电压
  5. bzoj:1692 [Usaco2007 Dec]队列变换1640 [Usaco2007 Nov]Best Cow Line 队列变换
  6. [DirectX11]Gerstner波 实现简单的水面模拟
  7. 【转】浅析Java中的final关键字
  8. Eureka(易瑞卡)注册中心【Zookeeper】分布式设计定理CAP
  9. 大致看了下伍德里奇的《计量经济学导论》
  10. ffmpeg java 使用教程_Java使用ffmpeg
  11. revit常用土建软件【桩转化】功能,CAD识别转化
  12. clickhouse-cpp 写入时卡住 bug调试
  13. 量子态层析(quantum state tomography)
  14. 哔哩哔哩直播步骤记录,避免遗漏
  15. lsdyna如何设置set中的node_list_如何监视 DOM 树的变动?
  16. ubuntu18.04安装Qt5.9.9后没有QtCreator启动图标
  17. 机器学习最常用的3种激活函数:Sigmoid、Tanh、Relu
  18. Android10 系统应用wifi连接和静态ip代理设置
  19. 如何巧妙的申请换部门_换部门申请书
  20. 为什么下水井盖是圆的

热门文章

  1. 图像及其表达与性质(上)
  2. 为什么`malloc`出来的内存也能当成对象正常使用
  3. 移动语义-右值引用-完美转发-万字长文让你一探究竟
  4. panel.setLayout(null);
  5. Nginx源码分析-内存池
  6. Easyexcel文件下载时,中文名称显示为下划线
  7. C语言再学习 -- 随机数函数
  8. IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (上篇)-js-ipfs-api
  9. JAndFix: 基于Java实现的Android实时热修复方案
  10. Hyperledger Fabric 交易流程