python笔记 - day4-之装饰器
python笔记 - day4-之装饰器
需求:
给f1~f100增加个log:
def outer(): #定义增加的log
print("log") def f1():
outer() #分别调用函数
print("F1") def f2():
outer() #分别调用函数
print("F2") def f100():
outer() #分别调用函数
print("F100") f1()
f2()
f100() 使用装饰器,增加log:
def outer(func):
def inner():
print("log")
return func()
return inner @outer
def f1():
print("F1") @outer
def f2():
print("F2") @outer
def f100():
print("F100") f1()
f2() 并增加after:
def outer(func):
def inner():
print('log')
ret = func()
print("after")
return ret
return inner @outer
def f1():
print("F1") @outer
def f2():
print("F2") @outer
def f100():
print("F100") f1()
f2()
装饰器流程剖析:
声明:
【函数的整体是可以被其他函数当做参数所调用,传递的】
def f1():
print('') def f2(xxx):
xxx()
f2(f1) 结果:123 流程剖析,例一:
def outer(func):
print(123,func) @outer
def f1():
print('F1') Readme:
1.执行程序后,会把123,重新赋值给f1,并且把老的,加载到内存的f1“print('F1')”,当做参数,当做参数,传给func;
2.print(123,func),func,就是老的f1,通过传给func打印出来;
流程剖析,例二:
def outer(func):
def inner():
print('before') #赋值给下面的f1
func() #调用执行老的f1
print('after')
return inner #把结果返回给下面f1,并赋值给下面的f1;(注意:这里加括号,就是执行函数;不加括号,就是把inner函数体所有内容返回给f1,并重新赋值给f1) @outer
def f1():
print('F1') f1() Readme:
* 定义了两个函数,没有调用函数,不会执行;
功能一:
加上@outer,(@ + 函数名)后实现的效果:
自动执行outer函数,并且将其下面的函数名f1当作参数传递;
功能二:
将outer函数的返回值,重新赋值给f1; 装饰器,返回值:
def outer(func):
def inner():
print('before')
r = func() #为什么不把这里直接写成return func(),因为这里这样写的话就会直接返回结果,下面的代码就不会执行了
print('after')
return r
return inner @outer
def f1():
print('F1')
return "砍你" ret = f1()
print("返回值:",ret)
装饰器,参数:
def outer(func):
def inner(arg): #这里加参数arg是因为执行程序后会把inner重新赋值给f1,
# 老f1有参数,所以也必须给inner加上参数;
print("before")
r = func(arg) #这里是执行的是老f1,老f1需要传入一个参数,
#r = func(123) #所以在这里给他传入参数;
print("after")
return r
return inner @outer
def f1(arg):
print(arg)
return "砍你" res = f1('fffff')
print(res)
装饰器,接收多个参数:
def outer(func):
def inner(*args,**kwargs): #想要接收多个参数,改这里
print('before')
r = func(*args,**kwargs) #想要接收多个参数,改这里
print('after')
return r
return inner @outer
def f1(arg):
print(arg)
return "砍你" ret = f1('fafafa')
print("返回值:",ret) @outer
def f2(arg1,arg2):
print("F2") f2('bbbbb','ccccc')
装饰器之-应用示例
验证用户登陆,不使用装饰器:
#!/usr/bin/python env
#_*_coding:utf-8 _*_
LOGIN_USER = {"is_login":False} def changepwd():
if LOGIN_USER['is_login']:
print("welcom to %s login"%LOGIN_USER['current_user'])
else:
print("Please login.") def manger():
if LOGIN_USER['is_login']:
print("welcom to %s login"%LOGIN_USER['current_user'])
else:
print("Please login.") def login(user,pwd):
if user == 'alex' and pwd == '':
LOGIN_USER['is_login'] = True
LOGIN_USER['current_user'] = user
manger() def main():
while True:
inp = input("1.manger 2.login")
if inp == '':
manger()
elif inp == '':
username = input("username:")
passwd = input("password:")
login(username,passwd)
main() 验证用户登陆,使用装饰器:
#!/usr/bin/python env
#_*_coding:utf-8 _*_
LOGIN_USER = {"is_login":False} def outer(func):
def inner(*args,**kwargs):
if LOGIN_USER['is_login']: #使用装饰器后,只有这个条件成立了,才会执行下面的函数
r = func() #只有上面条件成立了,才会执行func()这个函数
return r
else:
print("Please login")
return inner @outer
def changepwd():
print("welcom to %s login"%LOGIN_USER['current_user']) @outer
def manger():
print("welcom to %s login"%LOGIN_USER['current_user']) def login(user,pwd):
if user == 'alex' and pwd == '':
LOGIN_USER['is_login'] = True
LOGIN_USER['current_user'] = user
manger() def main():
while True:
inp = input("1.manger 2.login")
if inp == '':
manger()
elif inp == '':
username = input("username:")
passwd = input("password:")
login(username,passwd)
main()
装饰器-之执行流程图:

示例2:

示例3:

python笔记 - day4-之装饰器的更多相关文章
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- python笔记5:装饰器、内置函数、json
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
- python笔记-4(装饰器、生成器、迭代器)
一.熟练掌握装饰器的原理 (在装饰器学习的过程中,查了看了很多资料,个人感觉走了很多的弯路,这个笔记,分享我的理解,希望能帮助到一些人.本文对装饰器的描述,侧重点是条理与逻辑思路,想通过从无到有的方式 ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- python 3.x 的装饰器笔记
今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
随机推荐
- MySQL配置SQL Assistant提示
以前开发一直使用SQL Server数据库,提示插件采用的就是SQL Assistant,写起脚本来相当有效率.这段时间公司转型要采用MySQL数据库,试用了mysql workbench.mysql ...
- c#操作excel后关闭excel.exe的方法
关闭进程 C#和Asp.net下excel进程一被打开,有时就无法关闭, 尤其是website.对关闭该进程有过GC.release等方法,但这些方法并不是在所有情况下均适用. 于是提出了kil ...
- C++ and Java template class and function 模板类和模板函数
在C++和Java的泛式编程中,模板template的使用是必不可少的,但是Java中没有template关键字,所以两者的写法还是有些许区别的,请参见如下代码: Java的模板 // Java pu ...
- C++ 'dynamic_cast' and Java 'instanceof' 使用对比
在Java中,如果A是基类,B是A的派生类,那么instanceof可以用来判断一个实例对象是A还是B,相当于一个二元操作符,但与==, >, < 不同的是,它是由字母组成,是Java的保 ...
- hdu Rescue
因为要求的是最少的时间,很明显的是一个利用优先队列的bfs的题目,题目很一般. #include"iostream" #include"algorithm" # ...
- 多个mysql增加多个服务
//mysql安装目录 mysqld --install mysqld --remove mysql5.5 mysqld --remove mysql5.5 C:\Program Files\MySQ ...
- Wps 方框里面加勾
1.选择插入-->选择符号 2.选择更多 3.选择 字体Wingdings 然后下拉到最后.就看到了
- CKEditor的使用-编辑文本
官网下载以及演示:http://ckeditor.com/ 引入js <script src="/Example6/ckeditor/ckeditor.js">< ...
- apache日志文件太大的问题
apache日志文件太大的问题 处理Apache日志的两种方法 rotatelogs 是 Apache 2.2 中自带的管道日志程序 rotatelogs [ -l ] logfile [ rotat ...
- Apache Spark源码走读之13 -- hiveql on spark实现详解
欢迎转载,转载请注明出处,徽沪一郎 概要 在新近发布的spark 1.0中新加了sql的模块,更为引人注意的是对hive中的hiveql也提供了良好的支持,作为一个源码分析控,了解一下spark是如何 ...