python3----练习题(装饰器)
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。也就是说装饰器的作用就是为已经存在的对象添加额外的功能。 当使用@将装饰器附加到函数上时,就会调用此方法。
单层装饰器:
def outer(func):
def inner():
print("hello")
r = func()
print("end")
return r
return inner
@outer
def f1():
print("good!") f1() #1、执行outer函数,是将下面的函数名,当做outer函数的参数
#2、将outer的返回值重新赋值给f1,意思就是f1 = outer的返回值
双层装饰器:
注:对参数数量不确定的函数进行装饰,参数用(*args,**kwargs),自动适应参数数量。
和单层装饰器原理一样,只是在原有基础上又多了一个装饰器。示例:
def outer1(func):
def inner(*args,**kwargs):
print("")
ret = func(*args,**kwargs)
print("")
return ret
return inner def outer2(func):
def inner(*args,**kwargs):
print("")
ret = func(*args,**kwargs)
print("")
return ret
return inner @outer1
@outer2
def f():
return 'ok' r = f()
print(r) #打印结果:
123
456
789
369
ok # 1、执行outer2函数,将f作为outer2函数的参数,将f赋值给func
# 2、得到返回值inner,重新赋值给f:f = inner ==> f() = inner()
# 3、执行outer1函数,将整个inner函数作为outer1函数的参数
# 4、得到返回值inner,再重新赋值给f:f == inner ==> f() = inner()
# 5、因为装饰器只有两层,就不用再执行下一个装饰器函数,如果更多层就继续循环以上程序过程
# 6、下面就执行最终的inner函数,执行func函数时,就是执行最原始的f函数
深入浅出理解python 装饰器
之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.
先看下代码:
import time # 将函数作为参数传入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper @timeif
def foo(arg):
print("in foo() %s" % (arg)) if __name__ == '__main__':
foo(" Hello ") # 表示执行foo函数....
我的疑惑就是明明return 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:
# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
def funY():
return x
return funY # 不带参数的函数....
def funX1():
print("调用函数funX1") def funY1():
print("调用函数funY1")
return funY1 if __name__ == '__main__':
# print(funX(5)()) # 调用有参数的嵌套函数... print(funX1()()) # 调用无参数的嵌套函数...
这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:
# coding=utf-8
import time # 将函数作为参数传入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper # @timeif
def foo(arg):
print("in foo() %s" % (arg)) if __name__ == '__main__':
timeif(foo)(' Hello')


python3----练习题(装饰器)的更多相关文章
- (转)Python3.5——装饰器及应用详解
原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...
- python3.7 装饰器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- Python3.5:装饰器的使用
在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... pr ...
- python3之装饰器
1.装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处 ...
- python3之装饰器修复技术@wraps
普通函数 def f(): """ 这是一个用来测试装饰器修复技术的函数 """ print("哈哈哈") if __n ...
- Python3中装饰器的使用
较为复杂的装饰器使用: user,passwd = 'hjc',111111 def auth(type): print('auth type:',type) def outwrapper(func) ...
- python3 使用装饰器,及函数作为参数
#装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...
- 【python3】装饰器
参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...
- python3中装饰器的用法总结
装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...
随机推荐
- 关于comet
Comet是彗星的意思,这一技术之所以借用这个名字,是因为这里的每一次请求都有一个长长的“尾巴”.这个长尾巴就是我们感兴趣的长连接. 因为长连接的实现,Comet可以不需要安装浏览器插件就可以向客户端 ...
- Drupal中的模块载入
什么是模块载入?首先说载入,这里的载入是指require_once.模块载入就是指require_once模块目录中的某个PHP文件. 每个Drupal模块都应该有自己的主文件.模块主文件以模块名开始 ...
- DDL语句--改动表
改动表是指改动数据库中已经存在的表的定义.改动表比又一次定义表简单.不须要又一次载入数据.也不会影响正在进行的服务. MySQL中通过ALTER TABLE语句来改动表.改动表包含改动表名.改动字段数 ...
- (42)JS运动之多物体框架--多个div变宽
假设仅仅为div加入一个定时器的话.在多个div变宽的时候会发生故障.可是假设为每一个div加入一个定时器.那么就能够实现多个物体变宽. 注意:在多物体运动的情况下,全部东西不能共用.offsetXX ...
- 域对象的引用,ActionContext 和ServletActionContext类的使用
ActionContext 获取 域引用的map ServletActionContext获取具体域对象 //域范围 ActionContext ac = ActionContext.getConte ...
- Heap 3214 LIS题解
依据问题转换成最长不降子序列问题. 10^9的输入数据计算起来还是挺花时间的.由于这里仅仅能使用O(nlgn)时间复杂度了. 只是证明是能够算出10^9个数据的. 由于时间限制是5s. #includ ...
- ClientViaBehavior行为
ClientViaBehavior行为: 紧接红框:方式,也支持配置的应用方式
- scut协议配置工具初始化的一些问题
1.如果点击协议配置工具左上角的项目按钮没反应,说明数据库没有正确配置. 2.数据库创建脚本运行如果乱码,把utf-8改成ansi 3.如果ContractDB不存在就自行创建数据库. 4.使用sql ...
- Java服务CPU占用高问题定位方法
1. 概述 提供一种简单的方法来定位CPU高的问题. 找到CPU高的进程,比如232543: 执行top -H -p pid,找到占用CPU最高的线程号,比如232544,转换成16进制38c60: ...
- Atitit.100% 多个子元素自适应布局属性
Atitit.100% 多个子元素自适应布局属性 1.1. 原理1 1.2. Table布局1 1.3. Css布局1 1.4. 判断amazui加载完毕2 1.1. 原理 每个子元素平均分配,但是有 ...