python 装饰器理解与使用

函数装饰器在python中属于比较高级但是却实用并且常用的技术。常见的使用场景比如 要在类里面实现一个静态方法
则需要使用@staticmethod装饰器,类方法@classmethod则需要这个装饰器。
函数装饰器有两种使用方式,一种是带参数的,一种是不带参数的

先说第一种不带参数的装饰器使用方式

#-*- coding:utf-8 -*-
def dec(fun):
    print u"我是dec装饰器函数"
    return fun

@dec
def func():
    print u"我是func函数"

func()

以上代码输出如下

我是dec装饰器函数
我是func函数

以上是不带参数的装饰器使用方式
使用python分为两步 一是定义一个装饰器 二是将装饰器函数应用到函数上面
先说装饰器的定义
在python 一个装饰器可以使任意一个能够返回一个可调用对象的可调用对象
并且装饰器的第一个参数是当前被装饰的函数的引用 在此例中dec(fun) 这个参数即是对func函数的引用
learning python 的原话是这样说

In fact, decorators can be any type of callable and return any type of callable:

也就是说 一:装饰器本身是一个可调用的对象 二:装饰器必须返回一个可以调用的对象
先说一:

   饰器本身是一个可调用的对象

这句话意思是说装饰器本身必须是可调用的,比如说函数是一个可以调用的对象 所以可以用函数来做装饰器
但是也不一定必须是一个函数 比如一个实现了call方法的类对象也是一个可调用的对象也可以用一个实现了
call方法的类对象来做装饰器比如以下形式

#-*- coding:utf-8 -*-
class dec:
    def __call__(slef,fun):
        print u"我是类对象装饰器"
        return fun

@dec()
def func():
    print u"我是func函数"
func()

以上代码输出如下

我是类对象装饰器
我是func函数

再说二:
意思是说一个函数装饰器必须要返回一个可调用对象来替代被装饰的可函数,和第一条类似 返回的可以是一个函数也可其他可调用对象

#-*- coding:utf-8 -*-
def dec(fun):
    print u"我是dec装饰器函数"
    def rf():
        print(u"我是装饰器自定义的函数")
    return rf

@dec
def func():
    print u"我是func函数"

func()

输出

我是dec装饰器函数
我是装饰器自定义的函数

在之前的例子中我们之间返回的是被装饰的函数的引用,而在此处返回的是一个在装饰器里面定义的一个函数,这样就导致了原始函数被装饰器定义
的函数所取代

下面讨论装饰器的生效时间 当一个函数应用了一个装饰器的时候,当python运行到函数定义处时 也就是说装饰器在生成函数对象时就开始执行了
装饰行为看下面的代码

#-*- coding:utf-8 -*-
def dec(fun):
    print u"我是dec装饰器函数"
    def rf():
        print(u"我是装饰器自定义的函数")
    return rf

@dec
def func():
    print u"我是func函数"

输出

我是dec装饰器函数

上面的代码中并没有调用func函数 但是依然有输出 说明函数装饰器是在函数对象生成时就已经开始执行

再说带参数的函数装饰器
装饰器也可以带参数

#-*- coding:utf-8 -*-
def dec(arg):
    print u"我是带参数装饰器函数 -- 参数为%s" % arg
    def rf(fun):
        print(u"我是装饰器自定义的函数")
        return fun
    return rf

@dec('arg_1')
def func():
    print u"我是func函数"

func()

输出

我是带参数装饰器函数 -- 参数为arg_1
我是装饰器自定义的函数
我是func函数

注意装饰器的定义方式与之前定义方式的不同

装饰器嵌套

#-*- coding:utf-8 -*-
def dec(fun):
    print "in dec -- %s" % fun
    def y():
        pass
    return y

def dec1(fun):
    print "in dec1 -- %s" % fun
    def f():
        print "i'm in dec1 ***"
        pass
    return f

@dec1
@dec
def func():
    print u"我是func函数"
print func
func()

输出

in dec -- <function func at 0x028FDA30>
in dec1 -- <function y at 0x028FDA70>
<function f at 0x028FDA30>
i'm in dec1 ***

有以上输出顺序可知 python首先执行dec装饰器
并将func引用传入给dec 而dec返回的是内部定义的函数y
此后执行dec1装饰器 并经dec返回的函数y最为参数传给dec1
然后 dec1返回函数f 作为最终装饰结果
所以 调用函数func() 相当于调用dec1中的f()函数

内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码实现。该方法有效提升了定位精度稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码实现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移观测方程构建,以及EKF算法的具体实现步骤,具有较强的工程实践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论实现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位导航开发;③作为EKF算法在实际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法实现过程,重点关注状态预测观测更新模块的设计逻辑,可尝试引入真实传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究对比。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值