柯里化与无参装饰器

2024-05-09 22:20
文章标签 装饰 柯里化 无参

本文主要是介绍柯里化与无参装饰器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

柯里化

柯里化的概念:柯里化(Currying)在Python中是一种编程技术,它将原本接受多个参数的函数转换为一系列接受单个参数的函数。这种方法以逻辑学家Haskell Curry的名字命名。

简而言之就是将一次函数调用变成先放入一个参数得到的中间函数对象,然后再对中间函数对象进行传参,这样可以将多参数函数变成多个单参数函数。

def add(x):def inner(y,z):return x+y+zreturn innerprint(add(1)(2,3))

在第一个例子中,我们先将x传入得到一个带有x参数的函数对象,然后再对这个函数对象继续传入y,z两个参数,柯里化的程度是取决于我们的需要的,我们当然也可以将其分成三个函数,如下图

def add(x):def innner(y):def inner_1(z):return x+y+zreturn inner_1return innnerprint(add(1)(2)(3))

 现在,我们对柯里化有了一定了解,但我们该怎么把柯里化和装饰器关联在一起呢?

装饰器

你可以顾名思义,装饰器就是装饰函数用的,函数太单调?我们可以给它加一些功能让它尽可能丰满一些,为了丰富函数,有必要引入柯里化吗,我直接在函数里写不就行了?这就要考虑到代码侵入性问题了,我们将非业务代码(装饰代码)写在函数里,这就产生了业务与非业务代码的纠缠,这不利于后期代码的修改,何况,如果我想为多个函数进行装饰,难道我要一个一个copy过去?这显然不切实际,所以我们运用了函数的思想,把装饰代码封装到一个函数中,然后再将其应用在目标函数上,这实际上是将函数当作参数传入一个函数(高阶函数),而柯里化在其中的作用就是分割,它将装饰函数应用在目标函数然后返回一个装饰过的目标函数,但这个过程不会影响原目标函数,这可能有一些抽象,接下来我们应用实例来说明。

def add(x,y):return x+ydef logger(fn):def wrapper(*args,**kwargs):print("{} function is called. {},{}".format(fn.__name__,args,kwargs))ret = fn(*args,**kwargs)return retreturn wrapperadd = logger(add)

我们定义了一个日志修饰函数,这个修饰器的作用就是说明一下目标函数的使用情况,我们使用柯里化将参数分离,这样我们就能不用传入目标函数的参数了,比如说这个add (x,y),如果不使用柯里化,那我们就要传入x,y的值了,但这不是我们注重的部分,我们的目的是将修饰器应用在目标函数上,至于参数是什么,这不是我们考虑的范畴。所以柯里化其实就是把目标函数的参数与目标函数本身分割开,让我们可以更加关注修饰情况。

 

add = logger(add)

我们看到这行代码,其实柯里化的意图已经明显了,我们始终需要的就是这行代码,至于其他参数我们暂时不考虑,而这行代码在python中也作为语法糖(修饰器的语法)变换了存在形式。

在python中,我们用@来表示修饰函数。

装饰器语法

@标识符

标识符指向一个函数,用一个函数来装饰它下面的函数,logger称为装饰器函数,add称为被装饰或被包装函数

本质上来看,无参数装饰器logger实际上等效为一个参数的函数

无参数装饰器 logger

@logger 会把它下面紧挨着的函数的标识符提上来作为它的实参

如此,我们可以写成:

def logger(fn):def wrapper(*args,**kwargs):print("调用前增强功能")print("{} function is called. {},{}".format(fn.__name__,args,kwargs))ret = fn(*args,**kwargs)print("调用后增强功能")return retreturn wrapper@logger
def add(x,y):return x+y
print(add(1,2))

以上,就是无参装饰器的基本内容,下一篇我们将讨论有参装饰器的使用。

 

 

这篇关于柯里化与无参装饰器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974663

相关文章

Python中的属性装饰器:解锁更优雅的编程之道

引言 在Python的世界里,装饰器是一个强大的工具,它允许我们以一种非侵入性的方式修改函数或方法的行为。而当我们谈论“属性装饰器”时,则是在探讨如何使用装饰器来增强类中属性的功能。这不仅让我们的代码更加简洁、易读,同时也提供了强大的功能扩展能力。本文将带你深入了解属性装饰器的核心概念,并通过一系列实例展示其在不同场景下的应用,从基础到进阶,再到实际项目的实战经验分享,帮助你解锁Python编程

python+selenium2学习笔记unittest-04装饰器skip用法

在运行测试用例时,有时需跳过或判断用例时,可以用装饰器来实现 主要的几个方法就是下面的这几种 import unittestclass test(unittest.TestCase):def setUp(self):pass@unittest.skip('跳过')def test_01(self):print("直接跳过")@unittest.skipIf(3>2,'当条件为TRUE跳过')

python内置装饰器@staticmethod,@classmethod

2.@staticmethod,@classmethod 有了@property装饰器的了解,这两个装饰器的原理是差不多的。@staticmethod返回的是一个staticmethod类对象,而@classmethod返回的是一个classmethod类对象。他们都是调用的是各自的__init__()构造函数。 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@stat

Python中的装饰器及其应用场景

Python中的装饰器(Decorators)是一个非常强大且优雅的特性,它允许你在不修改原有函数或类定义的情况下,给函数或类增加新的功能。装饰器本质上是一个函数,它接收一个函数(或类)作为参数,并返回一个新的函数(或类),这个新函数(或类)会包含原函数(或类)的所有功能,并在其基础上增加额外的功能。装饰器的这种特性使得代码的重用性、可读性和可维护性都得到了极大的提升。 一、装饰器的基本概念

七、装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象自身的情况下,动态地向对象添加新功能。它通过将功能附加到对象的方式来增强其行为,提供了一种灵活的替代方案来使用子类扩展功能。 主要组成部分: 抽象构件(Component): 定义一个接口或抽象类,声明了要装饰的对象的基本功能。 具体构件(ConcreteComponent): 实现抽象构件的具体类,是

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)

5,结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: 代理模式 适配器模式 装饰者模式 桥接模式 外观模式 组合模式

js装饰器简单理解

装饰器(Decorator)是一种与类(class)相关的语法,用来注释或修改类和类方法。 装饰器是一种函数,写成@函数名。它可以放在类和类方法的定义前面。如下: @frozenclass Foo {@configurable(false)@enumerable(true)method() {}@throttle(500)expensiveMethod() {}} 上面代

61、Python之函数高级:为函数添加方法,实现属性可变的装饰器

引言 今天文章的标题,初读起来可能有些拗口,什么叫“为函数添加方法”?但是,如果真正对“Python函数也是对象”这个理念有清晰的理解的话,其实,也是不难理解的,本质上就是给一个对象新增一个自定义方法。通过这样做,我们就可以实现在运行过程中,对装饰器的属性进行动态修改了。 本文的主要内容有: 1、函数对象添加自定义方法 2、属性可变的动态装饰器 函数对象添加自定义方法 其实,这一点

JAVA学习笔记之​流,序列化,Socket和装饰者模型

http://toutiao.com/a6329568040976204033/?tt_from=mobile_qq&utm_campaign=client_share&app=explore_article&utm_source=mobile_qq&iid=5215874113&utm_medium=toutiao_ios JAVA学习笔记之​流,序列化,Socket和装饰者模型 御景

前端进阶|一文理解柯里化的逆操作,什么是反柯里化

温故而知新 在说反柯里化之前,先来复习下柯里化的基础。之前文章,我们了解了什么是柯里化,以及柯里化的实现原理,同时我们也明白了什么情况下我们使用柯里化,详细阅读参见之前文章《前端进阶|由浅入深的理解函数柯里化的实现与应用》,今天我们来了解一下反柯里化。 那什么是反柯里化呢??是与柯里化相反吗?? 书中对反柯里化的作用做了介绍: 反柯里化是为了扩大函数的适用性,使本来作为特定对象所拥有