1、装饰器和迭代器的概念。

  装饰器本质是一个函数,是为其他函数添加附加功能。

原则:不修改原函数源代码

     不修改原函数的调用方式

2、装饰器的简单应用

  

# Author : xiajinqi
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
func()
stop_time =time.time()
print("执行时间为 %s" %(stop_time - start_time))
return wrapper @timmer
def loggin():
time.sleep(1)
print("hello world") loggin()

3、理解装饰器的知识需要储备 :

函数即为变量、高阶函数 、嵌套函数

4、 函数在内存中定义。深入理解函数即为变量的概念.

  

需要区分定义和调用是两步进行的。必须要先定义再调用

def foo():
print("foo")
bar()
def bar():
print("bar") foo() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py
foo
bar Process finished with exit code 0 # Author : xiajinqi def foo():
print("foo")
bar() #foo 执行时候bar还没有定义所以执行会报错
foo()
def bar():
print("bar")
foo()
bar() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py
foo
Traceback (most recent call last):
File "E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py", line 6, in <module>
foo()
File "E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py", line 5, in foo
bar()
NameError: name 'bar' is not defined Process finished with exit code 1

5、函数即变量和高阶函数,高阶函数,将一个函数作为变量参数传递给另外一函数,返回值中包含函数。(可以实现装饰器的第一步,把改变代码添加功能,但是会改变调用方式还不是一个真正的装饰器)

#高阶函数
# Author : xiajinqi
import time
def foo():
time.sleep(1)
print("foo")
return 0 def test(func):
start_time = time.time()
func()
end_time = time.time()
print("tims is %s" %(end_time -start_time )) test(foo) #相当于给foo加了一个附加功能 但是还是不符合装饰器规则。改变了调用规则 #高阶函数 传递 test(foo)
# Author : xiajinqi
import time
def foo():
time.sleep(1)
print("foo")
return 0 def test(func):
print(func)
func()
return func foo=test(foo) # 在赋值时候,foo 作为地址传递给test函数,此处相当于同时调用了两个函数test和foo(test内部调用foo),所以会比foo更多的功能
foo() # 这时候的foo已经是新的foo了。

6、嵌套函数,在一个函数体内调用另外一个函数 

#高阶函数  传递 test(foo)
# Author : xiajinqi
def test():
print('test')
def bar() :
print('bar')
return bar #bar()内部调用 # 外部调用
bar=test()
bar()

7、函数的作用域

# 全局变量和局部变量
def test1():
print("test1")
def test2():
print("test2")
def test3():
print("test3")
test3() test1() #test2由于没有调用,所以test3也不会调用

8、装饰器的实现

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器
def deco(func):
start_time = time.time()
return func
end_time = time.time()
print("运行时间 %s" %(end_time-start_time)) def timeer(func):
def deco():
start_time = time.time()
func()
end_time = time.time()
print("运行时间 %s" % (end_time - start_time))
return deco @timeer
def test1():
time.sleep(1)
print("test1") @timeer
def test2():
time.sleep(1)
print("test2")
@timeer
def test3():
time.sleep(1)
print("test3") #test1=timeer(test1) #思考timemer存在的含义 timmer调用什么也没有做,传递func给deco
#test1() #相当于执行deco,但是如果直接调用deco 就会改变调用方式。因此需用timmer可以达到 test2()

  

9 、高级装饰器:

 

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器 def timeer(func):
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs) # 不定参数传递
end_time = time.time()
print("运行时间 %s" % (end_time - start_time))
return deco @timeer
def test1():
time.sleep(1)
print("test1") @timeer
def test2(name):
time.sleep(1)
print("test2 %s" %(name))
@timeer
def test3():
time.sleep(1)
print("test3") #test1=timeer(test1) #思考timemer存在的含义 timmer调用什么也没有做,传递func给deco
#test1() #相当于执行deco,但是如果直接调用deco 就会改变调用方式。因此需用timmer可以达到 test1()
test2("xiajinqi")

10、装饰器高潮,模拟网站登录,三个页面,其中两个需要加上验证功能

# Author : xiajinqi

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器 def auth(func):
def deco(*args,**kwargs):
print("func")
username = input("name:")
passwd = input("passwd:")
if username == 'xiajinqi' and passwd == '':
func(*args,**kwargs)
else :
print("认识失败")
return deco def index():
print("index of xiajinqi") @auth
def home(name):
print("index of home %s" %(name)) @auth
def bbs():
print("index of xiajinqi") index()
home("xiajinqi")
bbs()

python 装饰器和软件目录规范一的更多相关文章

  1. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  2. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  3. Python基础4 迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  4. Python之迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  5. Python_Day5_迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 列表生成 >>> a = [i+1 ...

  6. py基础4--迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1. 列表生成式,迭代器&生成器 列表生成式 我现在有个需求, ...

  7. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  8. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  9. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

随机推荐

  1. asp.net 服务器控件的 ID,ClientID,UniqueID 的区别

    1.简述 ID是设计的时候自己所指定的ID,是我们分配给服务器控件的编程标识符,我们常常使用this.controlid来寻找控件,那么这个controlid就是这里所说的ID. ClientID是由 ...

  2. 安装系统+数据库+Sharepoint全套教程 (摘抄自https://www.cnblogs.com/jianyus/p/5482075.html)

    前言 SharePoint 2016如约而至,之前也装过预览版,但是这次是正式版,还是分享一个完整的安装过程给大家,希望能给有需要的人有所帮助. 1.首先安装操作系统,我这里是Windows Serv ...

  3. 给腾讯云Linux主机创建Swap文件

    新买的腾讯云主机没有提供Swap分区 理由是由于主机经常因为内存使用率过高,频繁使用Swap,导致磁盘IO过高,服务器整体性能反而下降. 不过用户依然可以使用Swap文件的方式添加Swap. 方法如下 ...

  4. 在android工程中添加图片资源(转加)

    在Android工程中,每添加一个资源,就会在gen目录下的R.java中自动生成一个新的静态整型变量来指向这个资源.程序文件中调用资源的时候,先在R.java中找到变量名,然后根据变量值查找资源. ...

  5. 如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式

    如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式 这是曾经面试中的一道题目,当时的我用现在很潮的话讲,整个人是懵比的,我呆呆的说了句,我好像只知道for循环啊.后来回过神 ...

  6. python异常处理及内置模块

    异常处理 有时候我们在写程序的时候会出现错误或者异常,导致程序终止,如下这个例子: #!/usr/bin/env python a = 2/0 print(a) 结果提示如下错误: Traceback ...

  7. 数据类型.md

    数据类型 整型 数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字 ...

  8. Spring Security 自定义配置(1)

    @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapte ...

  9. Odoo工作流

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281264.html 一:工作流 工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程. 工作流.活动 ...

  10. Odoo模块添加logo

    模块的static目录是专门用于存放静态文件内容如:图片.css等的.其中,description目录是存放关于模块的一些描述性的文件的,其中,模块的图标也放在下面,以icon命名.