装饰器

#1、开放封闭原则:对扩展开放,对修改是封闭
#2、装饰器:装饰它人的,器指的是任意可调用对象,现在的场景装饰器-》函数,被装饰的对象也是-》函数
#原则:1、不修改被装饰对象的源代码 2、不修改被装饰对象的调用方式
#装饰器的目的:在遵循1,2的前提下为被装饰对象添加上新功能

(1)无参数类型

  1. import time
  2. def outer(func):
  3. def inner():
  4. time.sleep(1)
  5. print("hello")
  6. func()
  7. return inner
  8.  
  9. def bar():
  10. print('world')

(2)有参数类型

  1. # 有参装饰器
  2. import time
  3.  
  4. def auth2(engine='file'):
  5. def auth(func): # func=index
  6. def inner(*args,**kwargs):
  7. if engine == 'file':
  8. name=input('name>>: ').strip()
  9. password=input('password>>: ').strip()
  10. if name == 'egon' and password == '':
  11. print('login successful')
  12. return func(*args,**kwargs)
  13. else:
  14. print('login err')
  15. elif engine == 'mysql':
  16. print('mysql auth')
  17. elif engine == 'ldap':
  18. print('ldap auth')
  19. else:
  20. print('engin not exists')
  21. return inner
  22. return auth
  23.  
  24. @auth2(engine='mysql') #@auth #index=auth(index) #index=inner
  25. def index(name):
  26. time.sleep(1)
  27. print('welecome %s to index' %name)
  28. return 1111
  29.  
  30. res=index('egon') #res=inner('egon')
  31. print(res)

(3)并列装饰器

  1. import time
  2. def timmer(func):
  3. def inner(*args,**kwargs):
  4. start=time.time()
  5. res=func(*args,**kwargs)
  6. stop=time.time()
  7. print('run time is %s' %(stop-start))
  8. return res
  9. return inner
  10.  
  11. def auth2(engine='file'):
  12. def auth(func): # func=index
  13. def inner(*args,**kwargs): # 一致
  14. if engine == 'file':
  15. name=input('name>>: ').strip()
  16. password=input('password>>: ').strip()
  17. if name == 'egon' and password == '':
  18. print('login successful')
  19. res = func(*args,**kwargs) #一致
  20. return res
  21. else:
  22. print('login err')
  23. elif engine == 'mysql':
  24. print('mysql auth')
  25. elif engine == 'ldap':
  26. print('ldap auth')
  27. else:
  28. print('engin not exists')
  29. return inner
  30. return auth
  31.  
  32. @auth2(engine='file')
  33. @timmer
  34. def index(name):
  35. time.sleep(1)
  36. print('welecome %s to index' %name)
  37. return 1111
  38.  
  39. res=index('egon')
  40. print(res)

(4)

  1. from functools import wraps
  2. import time
  3. def timmer(func):
  4. @wraps(func)
  5. def inner(*args,**kwargs):
  6. start=time.time()
  7. res=func(*args,**kwargs)
  8. stop=time.time()
  9. print('run time is %s' %(stop-start))
  10. return res
  11. # inner.__doc__=func.__doc__
  12. # inner.__name__=func.__name__
  13. return inner
  14.  
  15. @timmer
  16. def index(name): #index=inner
  17. '''index 函数。。。。。'''
  18. time.sleep(1)
  19. print('welecome %s to index' %name)
  20. return 1111
  21.  
  22. res=index('egon')
  23. print(res)
  24.  
  25. print(help(index))

python 阿狸的进阶之路(4)的更多相关文章

  1. python 阿狸的进阶之路(9)

    tcp传输: 传输需要ack回应,然后才清空缓存,服务端先起来. tcp流式协议,tcp的Nagle的优化算法,会将时间间隔短,数据量小的打包成一个,然后发送给对方,减少发送的次数. UDP协议: 不 ...

  2. python 阿狸的进阶之路(6)

    常用模块 json # 序列化 #将内存的数据存到硬盘中,中间的格式,可以被多种语言识别,跨平台交互数据 #json 可以将字典之类的数据类型存到字典中 import json dic = {&quo ...

  3. python 阿狸的进阶之路(5)

    一.模块 1.什么是模块: 包含了一组功能的python文件,文件名是xxx.py,模块名是module. 可以使用 import module,四个通用的类别: (1)用python编写的py文件 ...

  4. day3 python 阿狸的进阶之路

    函数概念: 1.为什要有函数 组织结构不清晰,可读性差,代码冗余,可扩展性差. 2.什么是函数   具备某一个功能的工具--->函数     事先准备工具->函数的定义     拿来就用. ...

  5. python 阿狸的进阶之路(8)

    异常处理 http://www.cnblogs.com/linhaifeng/articles/6232220.html(转) 网络编程socket http://www.cnblogs.com/li ...

  6. python 阿狸的进阶之路(7)

    面向对象 转自林海峰的博客  http://www.cnblogs.com/linhaifeng/articles/6182264.html 面向对象的理解: 将数据分类,比如学生类.数据有关的函数, ...

  7. Python 从入门到进阶之路(一)

    人生苦短,我用 Python. Python 无疑是目前最火的语言之一,在这里就不再夸他的 NB 之处了,本着对计算机编程的浓厚兴趣,便开始了对 Python 的自学之路,并记录下此学习记录的心酸历程 ...

  8. Python 从入门到进阶之路(七)

    之前的文章我们简单介绍了一下 Python 中异常处理,本篇文章我们来看一下 Python 中 is 和 == 的区别及深拷贝和浅拷贝. 我们先来看一下在 Python 中的双等号 == . == 是 ...

  9. Python 从入门到进阶之路(六)

    之前的文章我们简单介绍了一下 Python 的面向对象,本篇文章我们来看一下 Python 中异常处理. 我们在写程序时,有可能会出现程序报错,但是我们想绕过这个错误执行操作.即使我们的程序写的没问题 ...

随机推荐

  1. windows下python2和python3同时安装ipython

    1.ipython简介: IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许 ...

  2. 知识点-jar包

    JAR文件的全称是Java Archive File,意思就是Java档案文件.通常JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,同城也被称为JAR包.JAR文件与zip文件的去区别就是在JA ...

  3. linux达人养成计划

    一.命令基本格式: ls -1 详细列表 (ll) -h 人性化显示文件大小 -a 显示所有文件,包括隐藏文件 -d 查看目录属性 -i 显示iNode 二.文件处理命令 mkdir -p [目录名] ...

  4. 第三章: web界面操作

    3.1 zabbix的web安装 3.1.1 使用浏览器访问 http://10.0.0.61/zabbix/setup.php 在检测信息时,可查看具体的报错信息进行不同的解决 选择mysql数据库 ...

  5. centos7 使用二进制安装mysql 5.7.23

    1.下载二进制安装包 mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz cd /usr/local/src wget https://cdn.mysql.com// ...

  6. OpenCV安装教程(Ubuntu 18.04)

    视频教程 带字幕版: https://www.youtube.com/watch?v=0vjC2UHptU4 无带字幕版:https://fzhshared-1252154746.cos.ap-gua ...

  7. 第9章 应用层(5)_文件传输协议FTP

    6. 文件传输协议FTP 6.1 FTP主动和被动模式 (1)FTP协议 ①与其他协议不同,FTP协议在客户端访问FTP服务器时需要建立两个TCP连接.一个用来传输FTP命令,一个用来传输数据. ②在 ...

  8. courator - create

    0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...

  9. Ramdisk虚拟内存盘,Swap分区

    虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术.相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度.但是RAM的易失性也意味着当关闭电源后这部分数据将 ...

  10. 用socket发送信息在浏览器上显示出来

    服务端代码: import socket def main(): sock=socket.socket() sock.bind(('localhost',8089)) sock.listen(5) w ...