88、Python之鸭子类型:函数是对象,对象也可以像函数一样使用

引言

在前面的文章中,我们曾经反复提及的理念,“Python中一切皆对象”。在这个理念支持下,Python中的函数也是对象的一种,那么我们有没有办法自定义对象,像函数一样来使用呢。

按照鸭子类型的理念来看,如果一个对象,用起来好像函数一样,那么这个对象就是“函数”。当然,严格说来,这些可以像函数一样使用的对象,统称为可调用对象。

本文就来简单介绍一下,如何使用Python中的魔术方法来实现可调用对象。

本文的主要内容有:

1、__call__方法与可调用对象

2、可调用对象的使用场景

3、可调用对象与闭包的简单比较

__call__方法与可调用对象

__call__()方法是Python中的一个魔术方法,它允许一个对象可以像函数一样被调用。

实现了__call__()方法的对象被称为可调用对象(Callable Objects)。可调用对象提供了一种灵活的方式来实现行为的封装,并且可以像函数一样被使用。

从广义上来看,函数对象也是可调用对象中的一种。

通过代码,简单演示一下__call__()方法的使用:

import mathclass power:def __init__(self, n):self.n = ndef __call__(self, value):if self.n is None:return Nonereturn math.pow(value, self.n)if __name__ == '__main__':pow_3 = power(3)print(f'3^3 = {pow_3(3)}')print(f'4^3 = {pow_3(4)}')

执行结果:

0ea5a3cde4e72f7b3ea154aa11899259.jpeg

从代码及执行结果中,可以看出,我们实现了一个可调用的对象的类power,然后通过这个类实例化的对象,都可以像函数一样直接调用了。

可调用对象的使用场景

虽然上面的例子只是一个很简单的幂运算的演示,其实,我们可以在__call__()方法中,实现支撑业务需求的更加复杂的运算或者操作的组合。

在实际使用中,可调用对象有比较广泛的应用,包括但不限于:

1、函数的对象化:其实函数本身就是对象了,但是直接使用函数,很多时候是缺乏状态的记录与管理的(当然,在函数式编程语境中,我们倡导的是无状态的纯函数),但是很多时候业务场景中,会需要进行状态的管理、操作的效果的累加。

2、可配置的函数行为:通过类的属性和方法来实现动态对函数行为的调整,从而满足更加灵活多变的业务需求。

3、装饰器:使用可调用对象作为装饰器,动态扩充函数的功能,这点在之前的装饰器的模块已经介绍了,需要的话,可以到故纸堆中翻看一下。

4、模拟闭包:这点在闭包章节中,也已经介绍过,闭包是一种给函数添加状态管理能力的手段。而可调用对象也可以实现同样的效果,而且,具有更好的可扩展性和可维护性。

讲道理说,是否要使用纯函数,还是要给函数加上状态管理的功能,还是要结合业务实际出发,看具体的适用场景。

需要适用状态的,非要应用函数式编程的理念来做,费力不讨好,不是脑子抽风了的本本主义了吗。

此外,一旦函数有了状态,类似于闭包,我们就可以很灵活的实现函数工厂、延迟执行函数的相关需求了。这里就不再展开了。

可调用对象与闭包的简单比较

既然可调用对象和闭包都可以实现函数状态管理的功能,干嘛非要添加一个可调用对象的概念呢。

接下来简单比较一下两者的优缺点:

本文的主角是可调用对象,所以先来看一下可调用对象的优缺点:

优点有:

1、状态管理通过类的属性和方法来实现,更加清晰、直观。

2、可以利用类的继承和多态实现可调用对象的行为的扩展,所以具有更好的扩展性。

3、从代码组织上,可调用对象的实现也具有更好的可读性、易于维护。

缺点也是有的:

1、本来这是简单的函数定义,扩展到了类的定义,代码会变得比较冗长。

2、类定义的方式中,会有些不可避免的样板代码,是我们比较讨厌的。

然后来一下闭包的优缺点:

可调用对象的缺点,反过来其实就是闭包的优点,所以闭包的优点有:

1、通过比较简洁的代码就可以实现简单的状态管理。

2、直接通过定义函数来实现所需的功能,避免了繁琐的样板代码。

闭包的缺点有:

1、状态管理实现不如可调用对象那样清晰直观,通常是通过闭包中的自由变量来实现。

2、扩展性相对较差,没法利用面向对象中继承和多态的特性。

所以,关于状态的管理,是该使用闭包还是该使用可调用对象,是要结合具体的使用场景的,没有绝对的好与坏,适用就好。

总结

本文主要介绍了__call__()这个魔术方法的使用,定义出的可调用对象,可以像函数一样被调用。可调用对象在函数对象化、状态的管理、行为的动态配置等场景中都是比较适用的。此外,比较了可调用对象与闭包这两者各自的优缺点。在具体使用中如何进行选择,就是见仁见智了。

以上就是本文的全部内容了,感谢您的拨冗阅读,希望您能有些许收获。

ea154af5e9259d69acd54fef75e228bf.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559462.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Delphi】使用并行数组和有序字典加快 Delphi RTL 速度(D12.2)

Delphi 12.2新增功能比较多,但 Delphi 运行时库(RTL)中的一些增强功能值得一提。比如: 新 TParallelArray 类 System.Threading 单元中有一个新的 TParallelArray 类,可以在数组项上并行运行 &For 和排序等操作。 在多核系统…

【有啥问啥】 群体智能(Swarm Intelligence):从自然到人工智能的深度探索

群体智能(Swarm Intelligence):从自然到人工智能的深度探索 什么是群体智能? 群体智能(Swarm Intelligence)是一个迷人的研究领域,它专注于社会性生物(如蚂蚁、蜜蜂、鸟类等&#…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节,我们重点介绍了提高 K 最近邻 (KNN) 算法的效率,这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效,但对于大型数据集来说,其计算成本可能会令人望而却步。为了…

实验室认证需要准备哪些文件材料?

实验室认证需要准备的文件材料通常包括以下几类: 一、法律地位文件 实验室成立文件及营业执照:包括实验室的成立证明文件、单位营业执照等,以证明实验室的法律地位和合法性。 人员任命文件:最高管理者(如总经理&…

Android 10.0 修改Systemui三键导航栏虚拟按键颜色功能实现

1.前言 在10.0的系统ROM定制化开发中,在对systemui的相关定制化开发中,在某些产品中,需要修改相关的 导航栏三键导航的虚拟按键的颜色,修改掉原来默认的虚拟按键的黑白色,接下来就来实现相关的功能 2.修改Systemui三键导航栏虚拟按键颜色功能实现的核心类 frameworks\ba…

图像处理(一)——CMC特刊推荐

特刊征稿 01 期刊名称: Data and Image Processing in Intelligent Information Systems 截止时间: 提交截止日期:2024年11月15日 目标及范围: 感兴趣的主题包括但不限于: 先进的数据处理技术; 智能数据分析; 智能系统…

【芯智雲城】Nanya车规DRAM存储解决方案

一、车规级芯片的特点: 汽车电子零部件的关键因素是以下两点: 1、可靠性(Reliability):要求部件必须能够承受日常使用的严酷和极端的温度、湿度、机械振动、冲击及车辆的复杂电气和电磁环境。 AEC-Q100对汽车零件工…

ARMv7/v8m GCC Compilation

00-Guide01-Toolchains02-GNU binutils03-ELF file04-Compilation process05-CFLAGS options06- Linker Scripts07 -Link Options08-Map file09-Static and dynamic lib10-Secureboot and image11-Builtin functions12-Function Attributes

聚合数字力量,数字产业集团构建产业互联新平台!

在数字经济蓬勃发展的今天,数字产业集团正以其强大的聚合力,引领着一场前所未有的产业互联革命。近日,中国信息协会产业互联网分会发布的《中国产业互联网平台数据地图》显示,全国已有超过1000家产业互联网平台企业,覆…

Kubernetes简介与部署+Pod管理与优化

一、简介 1.基础信息 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年Borg系统运行管理着成干上万的容器应用。Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统…

易泊车牌识别在 4S 店的应用

在当今数字化时代,车牌识别技术正逐渐成为各个行业提高效率和服务质量的重要工具。其中,易泊车牌识别系统在 4S 店中发挥着重要作用。 一、快速车辆登记 当客户驾车来到 4S 店时,易泊车牌识别系统能够迅速识别车牌号码,自动将车辆…

GPT-SOVIT模型部署指南

一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS: 仅使用 1 分钟的训练数据对模型进行微调,以提高语音相似度和真实感。跨语…

历时一个多月,搭建了一款培训考试小程序系统

前不久,一位在机构单位工作的朋友联系到我,说他们需要搭建一款内部培训考试系统,是关于安全知识学习与考试的。 此处省略好多张聊天页...... 为此,针对用户的需求,在搭建前,我做了大量的竞品分析&#xff…

MediaPlayer视频播放流程

MediaPlayer视频播放流程(基于Android8.0) 1. MediaPlayer源码分析 1.0 public class MediaPlayer extends PlayerBase implements SubtitleController.Listener, VolumeAutomation, AudioRoutingMediaPayer继承自PlayerBase类,分别实现了SubtitleController Volume…

带外管理卡虚拟控制台连接总结--持续更新

为避免维护服务器、小型机为连接虚拟控制台,采用的办法不对而导致浪费时间,特做以下总结: ##1、DELL PowerEdge R510 idrac 6(intergrated dell remote access contoller 6) server 2003 R2 SP2 用chomre 版本 47.0.2526.80 m打开https://…

C++:thread | condition_variable|mutex

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言thread创建线程传递参数给线程函数 mutexmutex常见用法 condition_variable:条件变量生产消费模型 引言 相信大家在Linux系统编程中都接触过线程创建和退出的相关系统调用&#xff0…

【数据结构与算法】简单聊聊图数据的存储

文章目录 1. 邻接矩阵(Adjacency Matrix)2. 邻接表(Adjacency List)3. 邻接多重表4. 十字链表5. 图数据库(Graph Database) 存储图数据的方法主要有几种,每种方法都有其特定的应用场景和优缺点。…

毕业设计项目-古典舞在线交流平台的设计与实现(源码/论文)

项目简介 基于springboot实现的,主要功能如下: 技术栈 后端框框:springboot/mybatis 前端框架:html/JavaScript/Css/vue/elementui 运行环境:JDK1.8/MySQL5.7/idea(可选)/Maven3&#xff08…

什么是物联网nb水表?

物联网NB水表是一种利用NB-IoT(窄带物联网)技术实现远程数据传输的智能水表。这种水表不仅能够精确计量用户的用水量,还能通过无线通信技术实现数据的远程传输和管理。下面我们来详细介绍物联网NB水表的主要特点和功能。 一、基本概念 -定义:物联网NB水…

如何优化spotbugsXml.xml文件来方便debug的落地方案来了

不优化的spotbugsXml.xml 使用maven 构建来运行spotbugs的小伙伴都知道,执行完下面的命令后 mvn clean install -U spotbugs:spotbugs 会在默认的在target目录下生成一个spotbugsXml.xml 文件,而打开这个文件,想要debug里面的具体问题&am…