6月4日 python学习总结 装饰器复习
1. 装饰器的原理以及为什么要使用装饰器
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
在不影响原代码结构的情况下为其添加功能
2. 装饰器的基本用法
def test(func):
def warpper(*args,**kwargs):
print("====start====")
func(*args,**kwargs)
print("=====end====")
return warpper @test
def f():
print("2018-06-04") f()
3. 带参数的装饰器
def test(m): #获取参数
def inner(func):
def warpper(*args,**kwargs):
print(m) #打印该参数
if m==1: #判断该参数
print("start")
func(*args,**kwargs)
print("end")
return warpper
return inner @test(m=1) #传入参数
def f():
print("2018-06-04") f()
4. 被装饰的函数有返回值怎么处理
res=func(*args,**kwargs)
return res
在执行该函数的时候 接收函数的返回值,并在其后return
5. 多个装饰器的执行顺序
装饰器函数的执行顺序是分为定义阶段和执行阶段的
装饰器函数在被装饰函数定义好后立即执行
在函数定义阶段:执行顺序是从内而外的
在函数执行阶段:执行顺序由外而内,一层层执行
例子:如下
def war1(func):
print("war1")
def inner(*args, **kwargs):
print("======war1 start=====")
func(*args, **kwargs) #inner
print("======war1 end=====")
return inner def war2(func):
print("war2")
def inner(*args,**kwargs):
print("======war2 start=====")
func(*args,**kwargs)
print("======war2 end=====")
return inner @war1
@war2
def f():
print("****self****")
f()

6. 装饰类的装饰器
import settings def singleton(cls): #cls=Mysql
_instance=cls(settings.HOST,settings.PORT) def wrapper(*args,**kwargs):
if args or kwargs:
obj=cls(*args,**kwargs)
return obj
return _instance return wrapper @singleton # Mysql=Singleton(Mysql)
class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port obj1=Mysql()
类的装饰器实现单例模式
7. 被装饰函数的属性变化
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
from functools import wraps
def test(func):
#当函数被装饰器装饰时,自身的name以及doc都没有了
#,若想获得原来的值,需要加上了一句
# 装饰器修复技术
@wraps(func)
def warpper(*args,**kwargs):
print("kaishi")
func(*args,**kwargs)
print("jieshu")
return warpper
@test
def f():
print("2018-06-04")
f()
print(f.__doc__) # 如果不加装饰器的修复技术,打出的warpper函数的__doc__
print(f.__name__) # 如果不修复,打出的是warpper
被装饰函数的属性变化
6月4日 python学习总结 装饰器复习的更多相关文章
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- 4月8日 python学习总结 模块与包
一.包 #官网解释 Packages are a way of structuring Python's module namespace by using "dotted module n ...
- 4月2日 python学习总结
昨天内容回顾: 1.迭代器 可迭代对象: 只要内置有__iter__方法的都是可迭代的对象 既有__iter__,又有__next__方法 调用__iter__方法==>得到内置的迭代器对象 调 ...
- 4月17日 python学习总结 反射、object内置方法、元类
一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...
- 4月12日 python学习总结 继承和派生
一.继承 什么是继承: 继承是一种新建类的方式,在python中支持一个子类继承多个父类 新建类称为子类或派生类 父类可以称之为基类或者超类 子类会遗传父类的属性 2. 为什么继承 ...
- 4月11日 python学习总结 对象与类
1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
随机推荐
- Java多线程之读写锁机制
Java多线程中有很多的锁机制,他们都有各自的应用场景,例如今天我说的这种锁机制:读写锁 读写锁,见名知意,主要可以进行两种操作,读和写操作,他们之间结合使用起来又是各不相同的.比如多个线程之间可以同 ...
- JVM性能调优与实战基础理论篇-中
JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ...
- Solution -「Gym 102956F」Find the XOR
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...
- C#字符串Base64编解码
C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现 ...
- Node 模块规范鏖战:难以相容的 CJS 与 ESM
自 13.2.0 版本开始,Node.js 在保留了 CommonJS(CJS)语法的前提下,新增了对 ES Modules(ESM)语法的支持. 天下苦 CJS 久已,Node 逐渐拥抱新标准的规划 ...
- 请求XSS攻击原理
起因 巨人的肩膀 一个神秘URL酿大祸,差点让我背锅! (qq.com)
- mysql基础复习(SQL语句的四个分类),
( ...
- Python 中 base64 编码与解码
base64 是经常使用的一种加密方式,在 Python 中有专门的库支持. 本文主要介绍在 Python2 和 Python3 中的使用区别: 在 Python2 环境: Python 2.7.16 ...
- 【C#】COM线程模型-套间 ApartmentState
线程模式是微软的COM基础中的极其重要的概念.一定要吃透!初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内. [STAThread] 可以理解成CoInitializ ...