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-之装饰器的更多相关文章

  1. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  2. python笔记5:装饰器、内置函数、json

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  3. python笔记-4(装饰器、生成器、迭代器)

    一.熟练掌握装饰器的原理 (在装饰器学习的过程中,查了看了很多资料,个人感觉走了很多的弯路,这个笔记,分享我的理解,希望能帮助到一些人.本文对装饰器的描述,侧重点是条理与逻辑思路,想通过从无到有的方式 ...

  4. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  5. python 3.x 的装饰器笔记

    今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...

  6. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  7. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  8. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  9. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  10. Python函数编程——闭包和装饰器

    Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...

随机推荐

  1. 创建 maven 本地仓库; (五)

    在 pom.xml 添加依赖包的时候,有时候会提示无法从 http://repo1.maven.org/maven2/ 获取的情况,这时可配置个本地仓库: 从网上下载 maven 仓库网站源码包 Ne ...

  2. 新浪微博iOS客户端架构与优化之路

    新浪微博iOS客户端架构与优化之路   随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类 ...

  3. OpenCV学习笔记——视频的边缘检测

    使用Canny算子进行边缘检测,并分开输出到三个窗口中,再给每一个窗口添加文字 代码: #include"cv.h" #include"highgui.h" / ...

  4. php连接redis数据库 操作redis任务队列

    首先你的安装phpredis扩展在你的服务器上 $redis = new Redis(); $redis->connect('119.29.10.xx',6379); $redis->au ...

  5. ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34 - Developer Notification

    We are trying to migrate from Struts 2.2 to Struts 2.3, after getting to run the project I am seeing ...

  6. Python的包管理工具--PIP安装使用

    最新安装方式 # wget https://bootstrap.pypa.io/get-pip.py # python get-pip.py  // 使用该方式安装已经不再要求提前安装setuptoo ...

  7. PHP date 格式化一个本地时间/日期

    PHP date 格式化一个本地时间/日期 date (PHP 4, PHP 5) date — 格式化一个本地时间/日期 说明 string date ( string $format [, int ...

  8. passing parameters by value is inefficient when the parameters represent large blocks of data

    Computer Science An Overview _J. Glenn Brookshear _11th Edition_C Note that passing parameters by va ...

  9. C#数组的排序

    对于数组的排序有好多种方法,上面这种是最常规的方法,当然在Array类中有两个方法就是专门来完成排序的,一会我们再来看这两方法,下面我们还是来看一下语法吧,只要搞懂语法了,就可以自己随便排序了. 冒泡 ...

  10. nginx php解析过慢

    nginx 报错 upstream timed out (110: Connection timed out)解决方案 error.log报错如下: 2013/05/18 21:21:36 [erro ...