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函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
随机推荐
- iOS完整学习步骤
一 C语言 1.1基本数据类型和基本运算 1.2 函数 数组 字符串 指针 1.3 预处理指令 1.4结构体 枚举 1.5 文件操作 内存管理 二 Objective - C 2.1 面向对象 2. ...
- 创建自定义 jQuery 移动主题
自定义页面.工具栏.内容.表单元素.列表.按钮等元素的外观 智能电话和平板设备的高采用率最终导致增加了对移动 Web 开发人员和设计师的需求.jQuery Mobile 框架支持您创建能与原生应用程序 ...
- unauthenticated user reading from net
今天有台数据库异常,登录服务器后执行show processlist,发现大量的 unauthenticated user 状态.如下: 于是第一时间想到DNS反向解析的问题,于是看看是否关闭DNS解 ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- flowvisor test(1)
参考: Flowvisor 入门 杨帅老师:mininet+FlowVisor+ODL环境搭建及实验1 安装: 参考: 1.Flowvisor安装 2.Mininet安装 3.官网,Floodligh ...
- Nginx 笔记与总结(2)信号控制
开启.关闭.重启 Nginx 官方地址:http://wiki.nginx.org/CommandLine 开启: /usr/local/nginx/sbin/nginx 关闭,用信号控制,语法: k ...
- Web 在线文件管理器学习笔记与总结(13)重命名文件夹(14)复制文件夹
(13)重命名文件夹 ① 重命名文件夹通过 rename($oldname,$newname) 实现 ② 检测文件夹名是否符合规范 ③ 检测当前目录中是否存在同名文件夹名称,如果不存在则重命名成功 i ...
- Python浮点数控制小数精度
将精度高的浮点数转换成精度低的浮点数. 1.round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂.round()不是简单的四舍五入的处理方式. For the bu ...
- SET GLOBAL slow_query_log=1
- Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL SHOW VARIABLES LI ...
- Matplotlib for Python Developers
这个教程也很不错,http://reverland.org/python/2012/09/07/matplotlib-tutorial/ 也可以参考官网的Gallery,http://matplotl ...