装饰器是闭包的一种使用场景;

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第二十六课——装饰器的更多相关文章

  1. NeHe OpenGL教程 第二十六课:反射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  3. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...

  4. python第二十九课——文件读写(读取读取中文字符)

    演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...

  5. Python学习第十一课——装饰器

    #装饰器:本质就是函数,为其他函数附加功能原则:1.不修改被修饰函数的源代码2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #高阶函数 ''' 高阶函数定义: 1.函数接受的参数是一 ...

  6. Python学习第二十六课——PyMySql(python 链接数据库)

    Python 链接数据库: 需要先安装pymysql 包 可以设置中安装,也可以pip install pymysql 安装 加载驱动: import pymysql # 需要先安装pymysql 包 ...

  7. python五十六课——正则表达式(常用函数之match)

    函数:match(regex,string,[flags=0])参数:regex:就是正则表达式(定义了一套验证规则)string:需要被验证的字符串数据flags:模式/标志位,默认情况下(不定义) ...

  8. 第二十六课 典型问题分析(Bugfix)

    问题1: glibc中的strdup实现如下: 没有对参数s进行空指针判断. 我们的Exception.cpp中应做改进: 在第12行进行判断空指针操作. 问题2: t1在析构时会抛出异常,我们在re ...

  9. Spring入门第二十六课

    Spring中的事务管理 事务简介 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性. 事务就是一系列的动作,他们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起 ...

随机推荐

  1. JavaScript学习总结(四)——this、原型链、javascript面向对象

    一.this 在JavaScript中this表示:谁调用当前函数this就指向谁,不知道调用者时this指向window. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是 ...

  2. Windows操作系统下Redis服务安装图文详解

    Redis下载地址:https://github.com/MSOpenTech/redis/releases 下载msi格式的安装文件. 1.运行安装程序,单击next按钮. 2.勾选接受许可协议中的 ...

  3. Collection集合的带All功能的测试

    public class Demo4_CollectionAll { public static void main(String[] args) { // Demo1(); // Demo2(); ...

  4. Docker:集装箱式“运输”在软件上的实现

    Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量.可移植.自包涵的容器引擎.开发者构建的应用可以一次构建全平台运行,包括本 ...

  5. django-分页paginator

    分页 Django提供了一些类来帮助你管理分页的数据 -- 也就是说,数据被分在不同页面中,并带有“上一页/下一页”标签.这些类位于 django/core/paginator.py 中. 示例 向 ...

  6. JSON 解析工具的封装(FastJSON-->Java)

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.添加依赖包 <dependency> <groupId>com.alibaba< ...

  7. C#反射的一些经验[转载]

    写代码的时候经常需要分析已有类型的信息例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA  a; 为例1. 通过typeof(ClassA) 或者 a.Get ...

  8. Leaflet.draw 无法编辑multipolygon类型多边形 解决方法

    问题说明 在做面要素的编辑的时候,当对multiploygon类型的面要素进行编辑的时候,出现如下错误: TypeError: Cannot read property 'lat' of null 通 ...

  9. Http 缓存机制

    HTTP 缓存体系 首先我将 Http 缓存体系分为以下三个部分: HTTP/ OK Cache-Control: no-cache Content-Type: image/png Last-Modi ...

  10. android--获取屏幕高宽度工具类

    //获得屏幕相关的辅助类 public class ScreenUtils { private ScreenUtils() { /* cannot be instantiated */ throw n ...