Python __call__()方法

news/2025/1/24 21:21:03/

        本节再介绍 Python 类中一个非常特殊的实例方法,即 __call__()。该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
举个例子:

class CLanguage:# 定义__call__方法def __call__(self,name,add):print("调用__call__()方法",name,add)clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")

程序执行结果为:

调用__call__()方法 C语言中文网 http://c.biancheng.net

可以看到,通过在 CLanguage 类中实现 __call__() 方法,使的 clangs 实例对象变为了可调用对象。

Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象可调用对象包括自定义的函数Python 内置函数以及本节所讲的类实例对象

        对于可调用对象,实际上“名称()”可以理解为是“名称.__call__()”的简写。仍以上面程序中定义的 clangs 实例对象为例,其最后一行代码还可以改写为如下形式:

clangs.__call__("C语言中文网","http://c.biancheng.net")

运行程序会发现,其运行结果和之前完全相同。
这里再举一个自定义函数的例子,例如:

def say():print("Python教程:http://c.biancheng.net/python")say()
say.__call__()

程序执行结果为:

Python教程:http://c.biancheng.net/python
Python教程:http://c.biancheng.net/python

不仅如此,类中的实例方法也有以上 2 种调用方式,这里不再举例,有兴趣的读者可自行编写代码尝试。

用 __call__() 弥补 hasattr() 函数的短板

        前面章节介绍了 hasattr() 函数的用法,该函数的功能是查找类的实例对象中是否包含指定名称的属性或者方法,但该函数有一个缺陷,即它无法判断该指定的名称,到底是类属性还是类方法。
        要解决这个问题,我们可以借助可调用对象的概念。要知道,类实例对象包含的方法,其实也属于可调用对象,但类属性却不是。举个例子:

class CLanguage:def __init__ (self):self.name = "C语言中文网"self.add = "http://c.biancheng.net"def say(self):print("我正在学Python")clangs = CLanguage()
if hasattr(clangs,"name"):print(hasattr(clangs.name,"__call__"))
print("**********")
if hasattr(clangs,"say"):print(hasattr(clangs.say,"__call__"))

程序执行结果为:

False
**********
True

可以看到,由于 name 是类属性,它没有以 __call__ 为名的 __call__() 方法;而 say 是类方法,它是可调用对象,因此它有 __call__() 方法


http://www.ppmy.cn/news/36833.html

相关文章

循环神经网络

循环神经网络(Recurrent Neural Network,RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接收其他神经元的信息,也可以接收自身的信息,…

Mysql集群MHA高可用架构

目录 1、MHA的组成 2、工作原理 3、配置 配置mysql环境(138 139 140) (1)初始化数据库(新机器可以不用) (2)配置master (3) 配置slave (4)启动mysql…

移动端动态研发模式能为敏捷迭代带来什么

互联网公司的软件研发与传统软件研发在管理模式上有着很大的区别,技术部门接收公司其他部门的需求,不断迭代更新完善整个平台功能以满足平台产品的日常运营需要。在这个过程中,研发团队需要进行快速交付,一般的周期在一周&#xf…

华为OD机试用java实现 -【停车场最大距离】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:停车场最大距离 题目 停车场…

ChatGPT火出圈,80%的设计师无事可做

自从疫情过后,设计行业开始变得很凌乱。很多同行开始打价格战,设计岗位逐渐演变成了一种新型的流水线。在我国,不管什么行业,到最终都会演变成饱和状态。用金融理论来说:供不应求,就赚钱,供过于…

我们的身边,“AR”在哪里?

AR技术 文章目录AR技术一、游戏二、教育三、建筑设计四、营销五、医疗AR技术已经广泛应用于各个领域,简单了解一些我们身边常见的AR技术应用吧。看看“AR”都在哪里? 一、游戏 AR技术可以将虚拟游戏元素与现实世界相结合,创造出更加真实的游戏…

【Qt】Qt单元测试详解(三):QTest测试GUI

1、模拟GUI事件函数 1.1 QTest::keyClicks():模拟键盘连续输入 原型: void QTest::keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)说明:模拟连续敲击键盘输入,delay 为两次敲击的间隔,单…

【再临数据结构】哈希表

目录 哈希函数 哈希碰撞 拉链法 线性探测法 常见的三种哈希结构 总结 哈希表(又称:散列表、Hash table) 哈希表是根据关键码的值而直接进行访问的数据结构。 这么说可能有些过于官方,其实数组就是一张哈希表。 哈希表中关…