python装饰器

Python—装饰器

时光总嘲笑我的痴心妄想 提交于 2019-12-05 00:50:23
一 装饰器 1.1 什么是装饰器 器:指的是具备某一功能的工具 装饰:指的是为被装饰器对象添加新功能 装饰器就是用来为被装饰器对象添加新功能的工具 注意:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象 2.2 为何要用装饰器 软件的设计应该遵循开放封闭原则,既对功能扩展是开放的,而对修改是封闭的。 二 装饰器的实现 函数装饰器分为:无参装饰器和有参装饰器两种,二者的实现原理一样,都是'函数嵌套+闭包+函数对象'的组合使用的产物。 装饰器的实现必须遵循两大原则: 1. 不修改被装饰对象的源代码 2. 不修改被装饰器对象的调用方式 如果想为下述函数添加统计其执行时间的功能 import time def download_movie(): print('开始下载电影...') # 模拟电影下载时间3秒 time.sleep(3) # 等待3秒 print('电影下载成功...') download_movie() # 函数执行 遵循不修改被装饰对象源代码的原则,我们想到的解决方法可能是这样 start_time = time.time() # 获取当前时间戳 download_movie() end_time = time.time() # 获取当前时间戳 print(f'消耗时间:{end_time - start_time}')

Python-基础-常用术语对照表

南笙酒味 提交于 2019-12-04 23:53:33
下面内容主要摘抄自 python 官网, https://docs.python.org/3.7/glossary.html#glossary ,部分内容有删减。 2to3 一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题。 2to3 包含在标准库中,模块名为 lib2to3;并提供一个独立入口点 Tools/scripts/2to3。参见 2to3 - 自动将 Python 2 代码转为 Python 3 代码。 因为官方将在2020年不再支持 Python 2.x, 在遇到没有 Python 2.X 版本 的code 的时候,可以尝试使用这个工具将代码转化成Python 的版本。 abstract base class -- 抽象基类 抽象基类简称 ABC,是对 duck-typing 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 hasattr() 显得过于笨拙或有微妙错误(例如使用 魔术方法)。ABC 引入了虚拟子类,这种类并非继承自其他类,但却仍能被 isinstance() 和 issubclass() 所认可;详见 abc 模块文档。 Python 自带许多内置的 ABC 用于实现数据结构(在 collections.abc 模块中)、数字(在 numbers 模块中)

Python学习之路6 - 装饰器

六眼飞鱼酱① 提交于 2019-12-04 21:43:43
定义 :本质是函数,(装饰其他函数)就是为其他函数添加附加功能。 原则 :1.不能修改被装饰的函数的源代码    2.不能修改被装饰的函数的调用方式 实现装饰器的知识储备:   1. 函数即“变量”   2. 高阶函数(满足下列条件之一就是高阶函数) a:把一个函数名当作形参传给另一个函数(在不修改被装饰函数源代码的情况下修改其功能,但是调用方式变了) b:返回值中包含函数名(不修改函数的调用方式,而修改函数功能)   3. 嵌套函数 总结: 高阶函数+嵌套函数=>装饰器 1. 函数即变量 def bar(): #这里定义个函数 print('this is bar...') func = bar #将函数当变量一样赋值给func func() #这是func加上()就可以当函数用了   这就是函数即变量。 2. 高阶函数 a: 把一个函数名当做形参传给另一函数(在不修改被装饰函数源代码的情况下修改其他功能,但是调用方式变了) def bar(): print('this is bar...') bar() print('----------------------------------') def test(func): #在这里增加了功能 print(func) test(bar) #但是这里修改了调用方式 b: 返回值中包含函数名(不修改函数的调用方式,而修改函数功能)

python的学习大纲

空扰寡人 提交于 2019-12-04 20:39:25
python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编程 并发编程 操作系统介绍 进程 线程 协程 来源: https://www.cnblogs.com/xtggbmdk/p/11882180.html

python装饰器 语法糖

不打扰是莪最后的温柔 提交于 2019-12-04 18:17:26
简介: 装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。 比如说我们写flask,路由就是用装饰器定义的。如果写权限控制,那么权限控制一般也是由装饰器来实现的。日志记录,一般也可以通过装饰器来实现。 简单说,就是为了给某些函数增加一种或几种功能的做法。 下面举例实现。 一:基本函数 1.源码 from time import sleep def watch_movie(): print('看电影') sleep(3) print('The End') if __name__ == '__main__': watch_movie() View Code 2.执行结果 代码很简单,先打印看电影,间隔3秒,打印The End。 二:装饰器原理 1.目标:计算函数运行时间 2.源码 from time import sleep, time def ceal_time(): before = time() watch_movie() after = time() print('函数运行%s秒' % (after - before)) def watch_movie(): print('看电影') sleep(3) print('The End') if __name__ == '__main__': ceal_time() View

Python常见经典 python中if __name__ == '__main__': 的解析

梦想与她 提交于 2019-12-04 18:02:27
http://www.cnblogs.com/zhouxiansheng/p/3929247.html python中if __name__ == '__main__': 的解析 当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。 /////////////////////////////////////////////////////////////////////////////////////////////////// 在cmd 中直接运行.py文件,则__name__的值是'__main__'; 而在import 一个.py文件后,__name__的值就不是'__main__'了; 从而用if __name__ == '__main__'来判断是否是在直接运行该.py文件 如: #Test.py class Test: def __init(self)

python装饰器的集中使用姿势

℡╲_俬逩灬. 提交于 2019-12-04 16:36:18
在Python中,装饰器是一种十分强大并且好用的语法,一些重复的代码使用装饰器语法的话能够使代码更容易理解及阅读。 因此在这里简单总结了一下Python中装饰器的几种用法以及需要注意的事情。 一、在装饰器中获取被装饰函数的参数 假设我们在开发web的时候,需要做反爬。要判断接口的访问来源我们就可以通过下面装饰器的方法来实现: def mydecorator(func): def wrapped(*args, **kwargs): print("进入装饰器") if args[0]['header'] == 'spider': print("code: 400") return result = func(*args, **kwargs) return result return wrapped @mydecorator def request_page(request): print("一个访问请求") print("返回了response") if __name__ == '__main__': request = { 'data': 100, 'header': 'spider' } request_page(request) 在这个装饰器中,我们在装饰器中获取了 request 中的 header 参数,如果判断访问来源于爬虫,那么便给它返回一个400。

Python类装饰器

安稳与你 提交于 2019-12-04 15:53:33
上次介绍了Python的函数装饰器,这次我们来讲一讲Python的类装饰器。 Python的类装饰器基本语法如下: def decorator(cls): print "6666666" return cls @decorator class Model(object): def __init__(self): print "model created" if __name__ == '__main__': model = Model() decorator即是装饰器函数,输入的cls是一个类,返回也是一个类(其实返回一个可调用对象就可以,例如函数)。所以其实上文的类装饰器就相当于: model = decorator(Model)() 这只是最基本的版本,既然返回只要是一个可调用对象就可以,我们就可以对输入的类进行一系列魔改: class A(object): def __init__(self): print "77777" def decorator(cls): return A @decorator class Model(object): def __init__(self): print "model created" if __name__ == '__main__': model = Model() print model 输出为: 77777 <__main__

python高级

荒凉一梦 提交于 2019-12-04 11:55:30
python高级 和is的使用 is 判断地址 比较两个引用是否指向了同一个对象(引用比较) 判断值 比较两个对象是否相等 深拷贝和浅拷贝 深拷贝 返回拷贝过的新对象 是对于一个对象所有层次的拷贝(递归) 浅拷贝 两个变量指向同一地址 是对于一个对象的顶层拷贝 拷贝的是引用 动态语言 运行时可以修改类和对象的内容,有__slots__约束属性值 生成器 generator 定义 在Python中,这种一边循环一边计算的机制,称为生成器 生成式 可对返回的值进行加工 yield 返回当前值,暂停 send 发送一个值 协程 两个方法交替执行,模拟多任务实现方式之一 迭代器 iterator 定义 迭代是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可以使用for循环和next() 生成器是迭代器,迭代器不一定是生成器 判断是否可以迭代 引用一个集合的模块 from collections.abc import Iterable,Iterator isinstance(listA, Iterator) iter函数 可迭代对象转换为迭代器 装饰器 decorator 闭包 方法内部声明方法,内部方法引用外部方法的变量,外部方法返回内部的引用 定义 拓展函数功能的一种函数,

Python 十大装 B 语法解析

大兔子大兔子 提交于 2019-12-04 11:30:45
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码 B 格,使之看上去更老练,读起来更优雅。 一、 for - else 什么?不是 if 和 else 才是原配吗? No ,你可能不知道, else 是个脚踩两只船的家伙, for 和 else 也是一对,而且是合法的。十大装 B 语法, for-else 绝对算得上南无湾!不信,请看: >>> for i in [1,2,3,4]: print(i) else: print(i, ' 我是 else') 4 我是 else 如果在 for 和 else 之间(循环体内)有第三者 if 插足,也不会影响 for 和 else 的关系。因为 for 的级别比 if 高, else 又是一个攀附权贵的家伙,根本不在乎是否有 if ,以及是否执行了满足 if 条件的语句。 else 的眼里只有 for ,只要 for 顺利执行完毕, else 就会屁颠儿屁颠儿地跑一遍: >>> for i in [1,2,3,4]: if i > 2: print(i) else: print(i, ' 我是