python三大器之装饰器的练习
装饰器 加载顺序从下至上 执行顺序从上至下
'''
多层装饰器
'''
def deco1(func): #func=deco2
def wrapper1(*args, **kwargs):
'''this is wrapper1'''
print('start 1')
result = func(*args, **kwargs)# wrapper2()
print('end 1')
return result
return wrapper1 def deco2(func):#func=deco1
def wrapper2(*args, **kwargs):
'''this is wrapper2'''
print('start 2')
result = func(*args, **kwargs)# wrapper3()
print('end 2')
return result
return wrapper2 def deco3(func):#func=foo
def wrapper3(*args, **kwargs):
'''this is wrapper3'''
print('start 3')
result = func(*args, **kwargs)#wrapper1()
print('end 3')
return result
return wrapper3 @deco1##deco1(deco2(deco3(foo)))
@deco2 #deco2(deco3(foo))
@deco3 #deco3(foo)
def foo(x, y):
'''this is foo'''
return x * y print(foo(8, 9))#wrapper1(wrapper2( wrapper3(foo)))执行从外往内
'''
输出结果:
start 1
start 2
start 3
end 3
end 2
end 1
72
''' '''
装饰的过程:
wrapper3 = deco3(foo)
wrapper2 = deco2(wrapper3)
wrapper1 = deco1(wrapper2)
foo = wrapper1 执行的过程:正好和装饰的过程相反。
foo(8, 9)--->wrapper1(8, 9)--->deco1(wrapper2)(8, 9)--->
|
v
deco1( deco2( deco3(foo) ) )(8, 9)<---deco1( deco2(wrapper3) )(8, 9)
类比穿衣服,穿(装饰)的时候从里往外一层套一层,脱(执行)的时候从外到里一层一层脱。
'''
python三大器之装饰器的练习的更多相关文章
- Python三大器之装饰器
Python三大器之装饰器 开放封闭原则 一个良好的项目必定是遵守了开放封闭原则的,就比如一段好的Python代码必定是遵循PEP8规范一样.那么什么是开放封闭原则?具体表现在那些点? 开放封闭原则的 ...
- python基础(补充):python三大器之装饰器
函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): i = ...
- python笔记 - day4-之装饰器
python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...
- Python进阶(六)----装饰器
Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: 增加一些额外的新功能 封闭原则: 不改变源码.以及调用方式 二丶初识装饰器 装饰器: 也可称装饰器函数,诠释开放封闭原则 ...
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
随机推荐
- web大附件上传,支持断点续传
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- mysql 提示ssl问题
问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...
- ThreadLocal是什么
早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使 ...
- hadoop大作业
1.数据准备 2.把CSV添加到/bigdatacase/dataset中 3.检查前5行并删除第一行 4.将csv文件导入hadoop并检查前10行数据情况 5.数据文件导入hive 6.在Hive ...
- 浅谈SOA面向服务化编程架构(dubbo)
dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...
- 迁移Git项目到Gitlab
假定Gitlab已经安装, 假定要迁移的Git项目目录为 demo 首先在Gitlab里创建一个新的project, 名称为demo (或者其他名称都可以) 然后在现有的Git项目目录下, 进行以下操 ...
- java8之Spliterator
基本用法: import java.util.Arrays; import java.util.Spliterator; import java.util.stream.IntStream; publ ...
- MySql分区后创建索引加速单表查询和连表查询
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/konkon2012/article/de ...
- CEF 访问需要认证网页或接口(在Request的Headers中添加认证Token)
转载:https://blog.csdn.net/wdw984/article/details/85275289 1.首先要让我们自己的CefClient这个类公有继承CefRequestHandle ...