1.  装饰器的原理以及为什么要使用装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

在不影响原代码结构的情况下为其添加功能

2.  装饰器的基本用法  

def test(func):
def warpper(*args,**kwargs):
print("====start====")
func(*args,**kwargs)
print("=====end====")
return warpper @test
def f():
print("2018-06-04") f()

3.  带参数的装饰器

def test(m):        #获取参数
def inner(func):
def warpper(*args,**kwargs):
print(m) #打印该参数
if m==1: #判断该参数
print("start")
func(*args,**kwargs)
print("end")
return warpper
return inner @test(m=1) #传入参数
def f():
print("2018-06-04") f()

4.  被装饰的函数有返回值怎么处理

res=func(*args,**kwargs)

   return res

在执行该函数的时候 接收函数的返回值,并在其后return

5.  多个装饰器的执行顺序

装饰器函数的执行顺序是分为定义阶段和执行阶段的

装饰器函数在被装饰函数定义好后立即执行

在函数定义阶段:执行顺序是从内而外的

在函数执行阶段:执行顺序由外而内,一层层执行

例子:如下  

def war1(func):
print("war1")
def inner(*args, **kwargs):
print("======war1 start=====")
func(*args, **kwargs) #inner
print("======war1 end=====")
return inner def war2(func):
print("war2")
def inner(*args,**kwargs):
print("======war2 start=====")
func(*args,**kwargs)
print("======war2 end=====")
return inner @war1
@war2
def f():
print("****self****")
f()

6.  装饰类的装饰器   

import settings

def singleton(cls): #cls=Mysql
_instance=cls(settings.HOST,settings.PORT) def wrapper(*args,**kwargs):
if args or kwargs:
obj=cls(*args,**kwargs)
return obj
return _instance return wrapper @singleton # Mysql=Singleton(Mysql)
class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port obj1=Mysql()

类的装饰器实现单例模式

7. 被装饰函数的属性变化

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。

from functools import wraps

def test(func):

#当函数被装饰器装饰时,自身的name以及doc都没有了

#,若想获得原来的值,需要加上了一句

 # 装饰器修复技术

    @wraps(func)   

    def warpper(*args,**kwargs):

        print("kaishi")

        func(*args,**kwargs)

        print("jieshu")

    return warpper

@test

def f():

    print("2018-06-04")

f()

print(f.__doc__)   # 如果不加装饰器的修复技术,打出的warpper函数的__doc__

print(f.__name__)  # 如果不修复,打出的是warpper

被装饰函数的属性变化

    

6月4日 python学习总结 装饰器复习的更多相关文章

  1. python学习笔记--装饰器

    1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...

  2. 4月8日 python学习总结 模块与包

    一.包 #官网解释 Packages are a way of structuring Python's module namespace by using "dotted module n ...

  3. 4月2日 python学习总结

    昨天内容回顾: 1.迭代器 可迭代对象: 只要内置有__iter__方法的都是可迭代的对象 既有__iter__,又有__next__方法 调用__iter__方法==>得到内置的迭代器对象 调 ...

  4. 4月17日 python学习总结 反射、object内置方法、元类

    一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...

  5. 4月12日 python学习总结 继承和派生

    一.继承 什么是继承:   继承是一种新建类的方式,在python中支持一个子类继承多个父类   新建类称为子类或派生类   父类可以称之为基类或者超类   子类会遗传父类的属性 2.  为什么继承 ...

  6. 4月11日 python学习总结 对象与类

    1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...

  7. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  8. python学习之装饰器-

    python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...

  9. python学习day14 装饰器(二)&模块

    装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...

随机推荐

  1. SQL代码规范

    1.  建表规约 1)   表中字段名称 a)    表达是否概念的字段,必须使用is_xxx的方式命名,数据类型是bit b)    小数类型为decimal,禁止使用float和double. 说 ...

  2. Java一维与二维数组的拷贝与排序

    Java一维与二维数组的拷贝与排序 目录 Java一维与二维数组的拷贝与排序 Arrays.sort() 一维数组升序排序 二维数组按行升序排序 二维数组按列升序排序 Java中的数组 Java中数组 ...

  3. PCI Verilog IP

    1      PCI IP设计 虽然PCI已经逐渐淘汰,但是还是有不少应用需要这样的接口通讯. 设计目的是为了提供基于源码的PCI IP,这样硬件就不必受限于某一个FPGA型号,也方便ASIC迁移.由 ...

  4. 6、前端--DOM操作(查找标签、节点操作、获取值操作、class操作、样式操作、绑定事件、内置参数this)

    DOM操作之查找标签 前缀关键字>>>:document # 基本查找(核心) document.getElementById 根据ID获取一个标签 document.getElem ...

  5. Solution -「Code+#2」「洛谷 P4033」白金元首与独舞

    \(\mathcal{Description}\)   link.   给定一个 \(n\times m\) 的网格图,一些格子指定了走出该格的方向(上下左右),而有 \(k\) 格可以任意指定走出方 ...

  6. MySQL基于GTID的组复制(MGR)

    环境准备 IP 主机名 操作系统 192.168.131.129 mgr-node1 CentOS7.6 192.168.131.130 mgr-node2 CentOS7.6 192.168.131 ...

  7. 多图|一文详解Nacos参数!

    Nacos 中的参数有很多,如:命名空间.分组名.服务名.保护阈值.服务路由类型.临时实例等,那这些参数都是什么意思?又该如何设置?接下来我们一起来盘它. 1.命名空间 在 Nacos 中通过命名空间 ...

  8. Spring Boot 自定义配置文件异常"expected single matching bean but found 2"

    运行环境:Spring Boot 2.5.0, IDEA 2020.3.2 异常详细信息: Injection of resource dependencies failed; nested exce ...

  9. pytest--mark基本使用(主要通过pytest.ini文件注册标签名,对用例进行标记分组)

    1.pytest中的mark介绍 mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记 名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等.如下 图,现在需要只执行红色 ...

  10. 2021顶级的开源 BI(商业智能)软件和报表工具

    在这个信息化时代,每分每秒都产生海量数据.在海量数据中,挖掘出有用的数据,并且能以较人性化.直观的方式展示这些数据,变得尤为重要.本文将介绍5款顶级开源 BI(商务智能)软件和报表工具,用于商业数据的 ...