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中的事务管理 事务简介 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性. 事务就是一系列的动作,他们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起 ...
随机推荐
- 设置了winform的背景图片随窗体的变化而变化
private void mainform_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; System.Drawi ...
- JS存储cookie读取cookie删除cookie详细用法
假设有这样一种情况,在某个用例流程中,由A页面跳至B页面,若在A页面中采用JS用变量temp保存了某一变量的值,在B页面的时候,同样需要使用JS来引用temp的变量值,对于JS中的全局变量或者静态变量 ...
- js 前端分页空间控件
现在web注重用户体验与交互性,ajax 提交数据的方式很早就流行了,它能够在不刷新网页的情况下局部刷新数据.前端分页多是用ajax请求数据(其他方式也有比如手动构造表单模拟提交事件等).通过js将查 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- linux上SVN服务器搭建后windows无法连接到服务器
忙了一天,linux搭建svn服务器,搭建好后windows一直无法连接,总觉得自己对: 原因: 1.以后禁止用sublime在本地编辑好后用XFTP上传到服务器(这样会导致文件权限问题,不能替换成功 ...
- vue 子组件和父组件
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.添加子组件 1.父组件修改 <template> <!-- v-for 表情表示循环输出数据 ...
- Angular Npm Package.Json文件详解
Angular7 Npm Package.Json文件详解 近期时间比较充裕,正好想了解下Angular Project相关内容.于是将Npm官网上关于Package.json的官方说明文档进行了 ...
- 【java】开发中常用字符串方法
java字符串的功能可以说非常强大, 它的每一种方法也都很有用. java字符串中常用的有两种字符串类, 分别是String类和StringBuffer类. Sting类 String类的对象是不可变 ...
- Vue -- vue-cli(vue脚手架) npm run build打包优化
这段时间公司新项目立项,开发组选用 Vue2.0 进行开发.当然也就一并用到 vue cli 进行自动化构建.结果在基础版本开发完成后,用 npm run build 命令打包上线时,发现以下几个问题 ...
- Unity Profiler CPU Usage(CPU使用情况)
在Profiler界面点击左侧CPU Usage,Profiler界面下方Hierarchy窗口会列出各个函数对当前CPU的耗时,从大到小排序. 然后分析,各个函数的耗时是否异常,分析有没有可以优化的 ...