Python装饰器学习

python 函数装饰器学习 如果看《Python 核心编程》上的讲解还是不太清楚,我建议看这个链接: Python装饰器学习          看完之后,这里有一些总结:  其实总体说起来,装饰器其实也就是一个**函数**,一个用来**包装函数的函数**,返回一个修改之后的**函数对象**,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问。 装饰器可以让函数轻装上阵,更重要的是将函数的约束放置于接口处 阅读详情

在《Core Python Programming 2nd》中学习到了装饰器,这对我来说是个完全陌生的语法,第一遍愣是没看懂,很有必要记一下。

 

第一眼看到这个词Decorator,我联想到了DP中的Decorator模式,后来才知道完全不是这么一回事。(再次鄙视一下国内浮躁的博客,我google了一下,几乎千篇一律都是什么锁同步装饰器、超时装饰器,我对原作者表达敬仰,可是大家都是转载就不像话了,也是对网络资源的极大浪费,也许真正有价值的博文就湮没在这片都是一模一样的东西里了)

 

1. 这是个什么东东?
书上说得不是太清楚,它说类似于Java的AOP(Aspect Oriented Programming,面向方面编程),我对AOP一无所知。根据我对许多例子用法的反复揣摩,我认为是类似于程序设计语义学中所说的前键 与后键 的概念(Eiffel中的@pre 与@post )。当然你可以在装饰器中做比前键与后键更多的事,如:引入日志、增加计时逻辑来检测性能、给函数增加事务的能力。

 

其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问。

 

2. 装饰器语法

(1)无参数装饰器

[python]  view plain copy
  1. def deco(func):  
  2.     print func  
  3.     return func  
  4. @deco  
  5. def foo():pass  
  6. foo()  

第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(记住一定要返回 ,不然外面调用foo的地方将会无函数可用。实际上此时foo=deco(foo))

 

我写了个小例子,检查函数有没有说明文档:

[python]  view plain copy
  1. def deco_functionNeedDoc(func):  
  2.     if func.__doc__ == None :  
  3.         print func, "has no __doc__, it's a bad habit."  
  4.     else:  
  5.         print func, ':', func.__doc__, '.'  
  6.     return func  
  7. @deco_functionNeedDoc  
  8. def f():  
  9.     print 'f() Do something'  
  10. @deco_functionNeedDoc  
  11. def g():  
  12.     'I have a __doc__'  
  13.     print 'g() Do something'  
  14. f()  
  15. g()  

 

(2)有参数装饰器

[cpp]  view plain copy
  1. def decomaker(arg):  
  2.     '通常对arg会有一定的要求'  
  3.     """由于有参数的decorator函数在调用时只会使用应用时的参数  
  4.        而不接收被装饰的函数做为参数,所以必须在其内部再创建  
  5.        一个函数  
  6.     """  
  7.     def newDeco(func):    #定义一个新的decorator函数  
  8.         print func, arg  
  9.         return func  
  10.     return newDeco  
  11. @decomaker(deco_args)  
  12. def foo():pass  
  13. foo()  

第一个函数decomaker是装饰函数,它的参数是用来加强“加强装饰”的。由于此函数并非被装饰的函数对象,所以在内部必须至少创建一个接受被装饰函数的函数,然后返回这个对象(实际上此时foo=decomaker(arg)(foo))

 

这个我还真想不出什么好例子,还是见识少啊,只好借用同步锁的例子了:

[python]  view plain copy
  1. def synchronized(lock):  
  2.     """锁同步装饰方法 
  3.     !lock必须实现了acquire和release方法 
  4.     """  
  5.     def sync_with_lock(func):  
  6.         def new_func(*args, **kwargs):  
  7.             lock.acquire()  
  8.             try:  
  9.                 return func(*args, **kwargs)  
  10.             finally:  
  11.                 lock.release()  
  12.         new_func.func_name = func.func_name  
  13.         new_func.__doc__ = func.__doc__  
  14.         return new_func  
  15.     return sync_with_lock  
  16. @synchronized(__locker)  
  17. def update(data):  
  18. """更新计划任务"""  
  19.     tasks = self.get_tasks()  
  20.     delete_task = None  
  21.     for task in tasks:  
  22.         if task[PLANTASK.ID] == data[PLANTASK.ID]:  
  23.             tasks.insert(tasks.index(task), data)  
  24.             tasks.remove(task)  
  25.             delete_task = task  
  26.     r, msg = self._refresh(tasks, delete_task)  
  27.     return r, msg, data[PLANTASK.ID]  

调用时还是updae(data)。

 

同时还可以将多个装饰器组合 使用:

[python]  view plain copy
  1. @synchronized(__locker)  
  2. @deco_functionNeedDoc  
  3. def f():  
  4.     print 'f() Do something'  

学后的总是感觉就是:装饰器可以让函数轻装上阵,更重要的是将函数的约束放置于接口处,使意图更加明了,同时又不增加调用者的负担。

Plant Simulation与ABB机器人虚实结合 阅读详情

相关推荐

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 436

python实现synchronized

利用python的装饰器实现类似java中的synchronized from threading import Lock,Thread from functools import wraps default_lock=Lock() lock_list={'default':Lock()} def synchronized(func=None,obj=None): if func i...

a1053904672的博客 4993

27-eMMC电路设计

eMMC硬件电路设计

weixin_66510961的博客 4006

线程安全问题 synchronized (原子性 (可见性 防止指令重排(volatile)))

线程安全问题 synchronized volatile(原子性 可见性 防止指令重排)

m0_46427670的博客 495

保姆级教程:手把手带你复现APFNet论文的RGBT目标跟踪模型(附完整代码与数据集配置)

本文提供了一份详细的APFNet论文复现指南,涵盖从环境搭建到模型测试的全流程。通过解析多模态融合模块和渐进式训练流程,帮助读者高效完成RGBT目标跟踪模型的复现工作,特别针对训练和测试中的常见问题提供实用解决方案。

weixin_29056781的博客 342

Wio-LR1121多频段LoRa模块技术解析与应用实践

LoRa技术作为低功耗广域物联网(LPWAN)的核心通信方案,通过独特的扩频调制技术实现远距离传输与强抗干扰能力。其工作原理基于CSS(Chirp Spread Spectrum)调制,支持动态调整扩频因子(SF)和带宽(BW)来平衡传输距离与数据速率。Wio-LR1121模块作为Semtech LR1121芯片的载体,创新性地整合了sub-GHz、S-Band和2.4GHz多频段支持,配合仅1.35μA的睡眠电流,为跨境物联网部署提供了硬件基础。在智慧农业、工业监测等场景中,开发者可通过SPI接口快速集成

weixin_33742618的博客 416

python原子性_synchronized使用及java中的原子性问题

1.Synchronized关键字使用class X {// 修饰非静态方法synchronized void foo() {// 临界区}// 修饰静态方法synchronized static void bar() {// 临界区}// 修饰代码块Object obj = new Object();void baz() {synchronized(obj) {// 临界区}}}说明:修饰静态方...

weixin_36334284的博客 496

camera——HAL层知识分享

CameraHAL层是Android相机系统的核心中间层,负责连接Framework层与硬件驱动层。它通过标准化接口解耦软硬件,实现跨平台兼容性,同时为厂商提供硬件定制空间。主要功能包括:设备管理、数据流处理、参数控制以及图像优化。关键子系统涵盖预览、拍照、录像、对焦与曝光等模块,采用HAL3的"请求-响应"模型实现精细控制。性能优化重点关注启动时间、帧率稳定性和延迟控制。通过分层架构设计(接口层-核心层-适配层)和缓冲池机制,确保高效数据传输和硬件资源调度。

2302_77429403的博客 2069

Python里面有没有synchronized?

**Python 没有 `synchronized` 关键字**,但可以通过 `threading.Lock`、`RLock` 或自定义装饰器实现类似功能。- 也可以手动调用 `lock.acquire()` 和 `lock.release()`。- **`threading.Semaphore`**:限制同时访问的线程数量。- **`threading.Condition`**:用于线程间的条件通知。- **`threading.Barrier`**:同步多个线程的进度。

xioayanran123的博客 613

在VSCode中使用LaTex+(grammarly语法检测,chatgpt翻译,Sumatra PDF 轻量级pdf阅读器)

整个文章分为以下几个内容,打 * 的是必须要安装的。

u011895157的博客 2万+

基于SAGE算法的宽带信道参数估计算法的MATLAB仿真

本文将介绍如何使用MATLAB进行SAGE算法的仿真,以便更好地理解和应用该算法。SAGE算法是一种基于最大期望(Expectation-Maximization)方法的迭代估计算法,用于估计未知的参数。在宽带信道参数估计中,SAGE算法通过迭代优化来估计信道的传输函数。总结起来,本文介绍了如何使用MATLAB进行基于SAGE算法的宽带信道参数提取算法的仿真。通过以上步骤,我们可以得到估计的信道响应,并与真实信道响应进行比较。此外,SAGE算法还可以与其他信道估计算法相结合,以提高估计的准确性和性能。

CodeRoarX的博客 1075

python 装饰器学习与实践

从图中我们可以看到,第1 ,函数执行后,正常执行了装饰器的语句;假设一个场景,在对多个函数进行装饰的同时又希望加入额外的不同处理,比如对于上一小节的test1、test2、test3,假设他们都需要一个传入一个系数和一个名称才能进行后续计算。但我们程序已经写好,如果对每个函数内容都去做try-except处理无疑是很费时的,这里我们就可以用装饰器对函数进行包装。装饰器,对现有函数进行装饰,可以在函数执行前、后编写程序来增加功能,实际就是在函数外层嵌套一层函数。

qq_41437305的博客 931

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 782

Python中装饰器是什么?为什么要学习装饰器?

装饰器是什么?为什么要学习装饰器?装饰器用于拓展原来函数功能的一种函数,在不改变原函数名或类名的情况下给函数增加新的功能。给已有函数增加额外功能的函数,它本质上就是一个闭包函数,我们学习得主要目的是掌握装饰器的语法格式。

Python栈 521

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python学习——装饰器

个人学习记录 搬运自:b站up主正月点灯笼的视频 例程代码:判断质数 import time # 装饰器的格式 传入的函数func。 def wrapper(): 和return wrapper是固定格式 def display_time(func): def wrapper(*args): # 调用函数的参数在这里通过args被传入进来 t1 = time.time() result = func(*args) # 把函数的返回值先记录下来放到result中,否则没有返回值,同时传入的参数在这里

qq_38604310的博客 267

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python装饰器入门_Python编程学习

Python允许你,作为程序员,使用函数完成一些很酷的事情。在Python编程学习中,函数是一等对象(first-class object),这就意味着你可以像使用字符串,整数,或者任何其他对象一样使用函数。 例如,你可以将函数赋值给变量: >>> def square(n): ... return n * n; >>> square(4) 16 >&g...

chen801090的博客 207

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python学习-装饰器

_new__方法允许在类创建时拦截,并返回任意对象(包括闭包函数)。这种实现方式非常灵活。示例:函数装饰器的实现name }!") greet("Alice") # 输出: # Before the function call # Hello, Alice!name }!") greet("Alice") # 输出: # Before the function call # Hello, Alice!示例:类装饰器的实现# 定义一个动态生成的类,继承自原始类。

weixin_45550881的博客 971

Python学习之——装饰器

Python学习之——装饰器

selfsongs 2万+

python装饰器教学_Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*-'''示例1: 最简单的函数,表示调用了两次'''def myfunc():print("myfunc() called.")myfunc()myfunc()第二步:使用装饰函数在函数执行前和执行后分别附加额外功能# -*- coding:gbk...

weixin_39765869的博客 64

Python学习难点之装饰器

知识补充 不定长参数 def test(*args, **kwargs): print(args) print(kwargs) test(3,'k',a=4,b='w') #(3, 'k') args是元组(未命名参数) #{'a': 4, 'b': 'w'} kwargs是字典(命名参数) 作用域 在python中,作用域分为两种:全局作用域和局部作用域。 全局作用域是定义在文件级别的变量...

南雁北归的博客 408

Python装饰器学习(九步入门)

Python装饰器学习(九步入门) Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 ...

avtcpm1927的博客 84

Python学习之装饰器

定义装饰器# 在调用原始函数之前执行的操作# 在调用原始函数之后执行的操作# 使用装饰器@decorator""""""

小鑫仔的博客 1127

【python学习】python的生成器和装饰器

https://github.com/JackKoLing/python_notes_with_ten_days 俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇: win10版 @小保,公众号:CV之道 【深度学习环境配置】手把手实战配置深度学习环境(win10版) Linux版 @小保,公众号:CV之道 【深度学习环境配置】手把手实战配置深度学习环境(Ubuntu20.04版) 【声明】:学习笔记基于互联网上各种

learning CV 1247

Python装饰器的学习

装饰器是Python语言一个别具特色的功能

一入代码深似海 255
上一篇: 比较详细Python正则表达式操作指南(re使用)[12]
下一篇: Python装饰器与面向切面编程
CsharpGame
博客等级 码龄21年 11粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值