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函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
随机推荐
- SSH框架优缺点
SSH框架优缺点 开源是3个框架共有的优点 Struts2框架(MVC框架)的优点如下: 1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现: 2) 丰富的标签库,大大提高了开发 ...
- people 0919
package liu0919; public class People { private double height;// 身高 private String name;// 名字 private ...
- [转载]从GetSafeHwnd()和GetSafeHandle()分析句柄和指针
GetSafeHwnd()和GetSafeHandle()的主要区别: 1.使用者不同: (1)窗体使用: GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的 ...
- Html - 对话箭头
对话箭头 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="U ...
- NVPerfHUD
http://www.cnblogs.com/cproom/archive/2006/11/13/559287.html NVPerfHUD是一个很好的3D程序调试工具,它是NVPerfKit的一部分 ...
- 每天php函数 - str_replace()
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) 该函数返回一个字符 ...
- 省略nslog打印
//#if #endif宏定义的意思就是如果定义了DEBUG,那么就使用NSLog输出:否则这段代码直接忽略.有人会疑问这个DEBUG和_DEBUG来自哪里,这个其实不用担心,这个来自于Xcode的默 ...
- in_array效率问题以及解决办法
先将要对比的数组中的 键 和 值 设置成一样 然后用isset() 进行对比,存在则删除
- 运维工程师必会的109个Linux命令
运维工程师必会的109个Linux命令 版本1.0 崔存新 更新于2009-12-26 目录 1 文件管理 6 1.1 basename 6 1.2 cat 6 1.3 cd 7 1.4 chgrp ...
- lua学习笔记
工作需要,上周对lua赶进度似地学习了一遍,主要参考<lua中文教程>一书,中间参考一些<lua游戏开发实践>,首先说说这两本书,后者不适合初学,里面是对一个游戏脚本系统进行粗 ...