简介

装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志、性能测试、事务处理、缓存等

装饰器的前提

闭包

一般来说,当一个函数嵌套另一个函数时,内部函数引用到了外部函数的变量,则形成了闭包,如下所示,outter与inner形成了闭包

def outter():
n = 1
def inner():
print(n)
return n
return inner() print(outter())

闭包的作用

1.内部函数可以访问外部函数的变量

2.将外层变量持久化到内存中(一般来说,函数内部的局部变量在这个函数运行完以后,就会被Python的垃圾回收机制从内存中清除掉)

装饰器的实现方式

方法装饰器

直接创建

def outter(func):
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner @outter
def decorator():
'''decorator'''
print('decorator') decorator()
print(decorator.__name__)
print(decorator.__doc__)

由此结果发现,当添加装饰器后会改变原有函数的__name__及__doc__属性,为此我们需要纠正回来

修改函数的名及注释

使用functools下的wraps转译

from functools import wraps

def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner @outter
def decorator():
'''decorator'''
print('decorator') decorator()
print(decorator.__name__)
print(decorator.__doc__)

可传参的装饰器

需要在外层再包装一个函数,传入需要传递的参数即可,传入的参数也可以用于内部逻辑代码的处理

from functools import wraps

def decorator(name):
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print(f'name:{name}')
print('inner start')
return func(*args, **kwargs)
return inner
return outter @decorator(name='test')
def test():
print('test') test()

类装饰器

直接创建(不带参数)

类装饰器不携带参数,只需构造方法传入方法,重写__call__方法即可

class Decorator():

    def __init__(self, func):
self.func = func def __call__(self, *args, **kwargs):
print('Decorator start')
self.func(*args, **kwargs)
print('Decorator finish') @Decorator
def test():
print('test') test()

携带参数创建

对于携带参数的类装饰器,构造方法需要为参数, 需要重写__call__方法且需要添加内部函数并返回,__call__方法传入方法,内部函数传递被装饰的函数的参数

class Decorator():

    def __init__(self, name):
self.name = name def __call__(self, func):
def inner(*args, **kwargs):
print('inner start')
print(self.name)
func(*args, **kwargs)
print('inner finish')
return inner @Decorator(name='test')
def test():
print('test') test()

python 装饰器理解的更多相关文章

  1. python装饰器理解

    1.装饰器的作用 在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能 原则: 1.不修改被装饰对象的源代码2.不修改被装饰对象的调用方式 目标: 为被装饰对象添加新功能 2.装饰器的 ...

  2. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  3. 如何理解Python装饰器

    如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...

  4. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  5. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  6. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  7. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  8. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  9. 【Python】装饰器理解

    以下文章转载自:点这里 关于装饰器相关的帖子记录在这里: 廖雪峰, thy专栏, stackflow Python的函数是对象 简单的例子: def shout(word="yes" ...

随机推荐

  1. 如何基于 ZEGO SDK 实现 Android 通话质量监测

    功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 参考 下载示例源码 获取源码. 相关源码请查看 &qu ...

  2. Mqtt入门:在线调试连接阿里云

    近期课设需要做个东西,我想要做个上位机更好的显示. 但是一开始学习一样东西,听没头绪的,不知道从哪里入手,尝试过去B站找视频看,但是感觉视频讲的都是基础的东西,不是说人家up主讲的不好,只是对于入门, ...

  3. 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  4. 使用 oh-my-posh 美化 windows terminal,让其接近oh-my-zsh

    本文旨在快速让你进行美化,少踩一些坑,原文出自我的博客:prettier-windows-terminal-with-oh-my-posh 为了同 iterm2 下的 oh-my-zsh 保持基本一致 ...

  5. 论文解读(AGE)《Adaptive Graph Encoder for Attributed Graph Embedding》

    论文信息 论文标题:Adaptive Graph Encoder for Attributed Graph Embedding论文作者:Gayan K. Kulatilleke, Marius Por ...

  6. Node.js精进(1)——模块化

    模块化是一种将软件功能抽离成独立.可交互的软件设计技术,能促进大型应用程序和系统的构建. Node.js内置了两种模块系统,分别是默认的CommonJS模块和浏览器所支持的ECMAScript模块. ...

  7. ShardingSphere-proxy-5.0.0分布式雪花ID生成(三)

    一.目的 保证在分库分表中每条数据具有唯一性 二.修改配置文件config-sharding.yaml,并重启服务 # # Licensed to the Apache Software Founda ...

  8. Java注解和反射

    1.注解(Annotation) 1.1.什么是注解(Annotation) 注解不是程序本身,可以在程序编译.类加载和运行时被读取,并执行相应的处理.注解的格式为"@注释名(参数值)&qu ...

  9. 无法打开虚拟机“master”(D:\文档\Virtual Machines\master\master.vmx):未找到文件。是否从库中移除“master”?

    今天打开虚拟机的时候,出现了这样的弹窗提示: 无法打开虚拟机"master"(D:\文档\Virtual Machines\master\master.vmx):未找到文件.是否从 ...

  10. 基于Vite+React构建在线Excel

    Vite是随着Vue3一起发布的一款新型前端构建工具,能够显著的提升前端开发体验,它主要由两部分组成: (1)一个开发服务器,它基于**原生ES模块提供了丰富的内建功能,如速度快到惊人的 模块热更新( ...