函数装饰器的推导及副作用解决

本文详细介绍了Python装饰器的作用、原理和实现过程,从需求分析到功能业务分离,再到柯里化的应用,逐步揭示装饰器的推导公式。同时,文章探讨了装饰器的副作用,包括函数属性的改变,以及如何通过闭包和柯里化解决这一问题。此外,还讲解了无参装饰器、有参装饰器和返回装饰函数的分类,并给出了具体的装饰器案例。
摘要由CSDN通过智能技术生成

装饰器得作用

在原函数功能不变的前提下,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器得作用就是避免了为增强函数功能,强势入侵的代码。

装饰器铺垫知识

闭包

在嵌套函数中,内层函数引用到了外层函数的自由变量,而非全局变量,就称之为闭包

柯里化

定义

  • 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程,新的函数返回一个以原有第二个参数为参数的函数
  • z=f(x,y)转换成z=f(x)(y)的形式

举例

将加法函数柯里化:

def add(x,y):
    return x + y

柯里化转换为:

def add(x):
    def _add(y):
        return x+y
    return _add
#这样就将原本的add(5,6)转换为add(5)(6)

高阶函数

定义

  • 数学概念中,高阶函数为y=g(f(x))
  • 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
    (1). 接受一个或多个函数作为参数
    (2). 输出一个函数

举例1

计数器

#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def counter(base):
    def inc(step=1):
        nonlocal base #声明非本地变量
        base += step
        return base
    return inc 

装饰器推倒公式

推倒step0需求分析

一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息

#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def add(x,y):
    return x + y

增加信息输出功能

#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def add(x,y):
    print("call add,x+y")
    return x + y

增强功能函数缺点
- 打印语句的耦合度太高,若有100个函数需要同样的功能,则100个函数每个都需要添加同样的代码
- 加法函数属于业务功能,而输出信息的功能,属于非业务功能代码,不该放在业务函数加法中

推导step1,功能业务分离

  • 利用高阶函数进行将功能函数与业务函数进行分类
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def logger(fn):
    print"Call function begin")
    func = fn(10,30)
    print("Call function end")
    return func
def add(x,y):
    return x+y
#此时将函数add作为logger的参数传入,标准的高阶函数,此时相当于
#
#
#
#
#变形如下,问题是参数是固定死的,无法自由传入
def logger(add):
    print"Call function begin")
    func = add(10,30)  #结果为30
    print("Call function end")
    return func      #此时将30返回,而且实现了打印

遗留问题:
此时功能函数也业务函数是已经实现分离,但是问题在于参数的传入,此时函数的参数是在函数体中是固定死的,在现实中函数参数是灵活的,不可能是一成不变的,因此需要对

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值