python第二十六课——装饰器
装饰器是闭包的一种使用场景; python中的装饰器在定义上需要传入一个函数对象, 在此函数执行之前或者之后都可以追加其它的操作, 这样做的好处是,在不改变源码(原本业务逻辑的)同时,进行功能的扩展; 它在python中一般被使用在,性能测试,插入日志,事务管理,权限校验... 它就好比是一个切面(可插拔的),也就是我们之后学习中会提到的叫面向切面编程(aop) 开放封闭原则: 开放: 在不改动源码(破坏原本业务逻辑)的同时扩展新的功能 封闭: 不允许随意去修改源代码 说明装饰器的好处:
部门A:维护和管理数据信息平台 信息平台:内部封装了一些核心的api和接口 装饰器:函数(fn) 部门B:
m1():
func1()
func2()
func3() 部门C:
func4()
func5()
func6()
import time
def outer(fn):
def inner():
print('功能开始前记录日志...')
start=time.time()
fn()
print('功能介绍了记录日志...')
end=time.time()
print(end-start)
return inner @outer
def test():
print('我是test函数...')
test()
演示函数装饰器的几种常见的定义格式: 无参数无返回值的装饰器
def outer(fn):
def inner():
print('功能开始前记录日志...')
fn()
print('功能介绍了记录日志...')
return inner @outer
def test():
print('我是test函数...')
test()
无参有返回值的装饰器
def make_bold(fn):
def wrapper():
return '<b>' +fn()+'</b>'
return wrapper def make_italic(fn):
def wrapper():
return '<i>' +fn()+'</i>'
return wrapper @make_bold
@make_italic
def test():
return 'hello zsq'
print(test())
有参有返回值的装饰器
def zhuangshiqi(fn):
def wrapper(name,age,sex):
print(name,age)
fn(name,age,sex)
print(sex)
return 'abcdefg'
return wrapper @zhuangshiqi
def test(n,a,s):
print('我叫: %s,年龄为:%s,性别是:%s' %(n,a,s)) res=test(name='hank',age='',sex='男')
print(res)
通用装饰器
def zsq(fn):
def wrapper(*args,**kwargs):
# print(args)
fn(*args,**kwargs)
# print(kwargs)
# return '装饰器不难学'
return wrapper @zsq
def test(name,age,hobby):
print('我叫:%s,年龄为: %s,爱好是: %s' %(name,age,hobby)) print(test(age='',name='班长',hobby={'游戏':'魔兽','女性':'御姐','体育':'篮球'}))
python第二十六课——装饰器的更多相关文章
- NeHe OpenGL教程 第二十六课:反射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...
- python第二十九课——文件读写(读取读取中文字符)
演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...
- Python学习第十一课——装饰器
#装饰器:本质就是函数,为其他函数附加功能原则:1.不修改被修饰函数的源代码2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #高阶函数 ''' 高阶函数定义: 1.函数接受的参数是一 ...
- Python学习第二十六课——PyMySql(python 链接数据库)
Python 链接数据库: 需要先安装pymysql 包 可以设置中安装,也可以pip install pymysql 安装 加载驱动: import pymysql # 需要先安装pymysql 包 ...
- python五十六课——正则表达式(常用函数之match)
函数:match(regex,string,[flags=0])参数:regex:就是正则表达式(定义了一套验证规则)string:需要被验证的字符串数据flags:模式/标志位,默认情况下(不定义) ...
- 第二十六课 典型问题分析(Bugfix)
问题1: glibc中的strdup实现如下: 没有对参数s进行空指针判断. 我们的Exception.cpp中应做改进: 在第12行进行判断空指针操作. 问题2: t1在析构时会抛出异常,我们在re ...
- Spring入门第二十六课
Spring中的事务管理 事务简介 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性. 事务就是一系列的动作,他们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起 ...
随机推荐
- css溢出滚动条及去除滚动条的方法
<div class="father"> <div class="childern"></div> </div> ...
- android studio 断网使用
- C#中利用LightningChart绘制曲线图表
最近在做一个“基于C#语言的电炉温控制软件设计”的设计,我在大学并不是专业学习C#语言编程的,对C#的学习研究完全是处于兴趣,所以编程技术也不是很厉害,遇到问题多参照网络上的开源码. 这不,在做这个课 ...
- NPOI 之导入导出
转自https://www.cnblogs.com/zuowj/archive/2015/05/04/4475663.html转别人的,做了一点点改动 using NPOI.HSSF.UserMode ...
- C# fileUpload视频上传
要实现大文件上传必须配置webConfig例如: <system.web> <compilation debug="true" targetFramework=& ...
- 【Java并发编程】10、Java 理论与实践: 正确使用 Volatile 变量
转自:http://www.importnew.com/15842.html Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchron ...
- 9102年了,你还在用for循环操作集合?
本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 前段时间公司书架多了一本<Java8 实战>,毕竟久闻lambda的大名,于是借来一阅.这一看,简直 ...
- 启动SpringBoot项目
Eclipse创建Spring Boot项目 1.访问http://start.spring.io/ 解压引入Maven项目 2.建议的目录结构 com +- example +- myproject ...
- SpringBoot拦截器中无法注入bean的解决方法
SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...
- apicloud 消息推送与接收
待解决的问题,如下: 在使用apicloud 的时候我们,在开发用户登录的时候可能会遇到这样的问题,当有2个设备a,b同事使用的app的时候并且是同一个人登录,我们需要去做判断,即大家常说的单点登录. ...