当前位置: 首页 > news >正文

c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?

前言

在关于Python描述符函数的详解三篇中,我们有提到如何基于类创建一个“描述符函数”,之所以能够基于类创建这样一个概念,是因为用到了类中的__call__属性,从前述文章中可知,当类中定义了__call__属性时,基于该类所创建的对象就成为一个可被调用的函数。这样的做法我们已经知道,可是这中间的运行机制是怎样的呢?这一篇文章中,我们将从函数的可被调用性入手来深入分析一下。

Python中的可调用操作符

当我们谈到在Python中调用一个函数时,通常指的是在特定函数名后紧跟一对小括号,当然如果有参数的话,将参数包括在小括号中,甚至有人将函数名后的成对小括号称为“调用操作符”,如果函数名后不带成对小括号,那么Python解释器只是给出这是一个函数的提示,并不会运行它,比如先定义一个函数say_hello
def say_hello():    print("Hello Python!")
当不带对成小括号时:
say_hello输出:<function __main__.say_hello()>
从上述输出可知,Python解释器只是告诉我们say_hello是一个函数,如果带上成对小括号,那么该函数就会被执行:
say_hello()输出:Hello Python!
很显然,所有的函数都是可被调用的。 但是当任意给出一个对象时,我们如何知道它是否可以被调用呢? 难道要对每一个给定的对象都带上成对小括号进行测试吗? 如果真是这样的话,我们来看看那些不能被调用的对象带上成对小括号后,结果会怎样,比如我们来定义一个字符串,看看字符串是否可被调用:
hello = "Hello, Python!"hello()

cab3214652936ab9e994436fd1f23641.png

上述代码在执行时 被解释器报出错误,从提示来看,是说 str 对象不具备可调用性,那么,有没有一种方便的方法来测试哪些对象可被调用,哪些又不可被调用呢? 答案是肯定,那就是callable()函数。

callable()函数

Python的内置函数中,有一个callable()函数恰好是专门用来测试一个对象是否可被调用,当该对象可被调用时,它返回True,否则返回False,比如我们用它来测试一下上面创建的函数say_hello()函数和hello字符串:
>>> callable(say_hello)>>> 输出:True>>> callable(hello)>>> 输出:False
在之前的文章中,我们知道lambda函数是匿名函数,那么这类函数是可被调用的吗?下面一个例子可给出说明:
>>> callable(lambda x: x*x)>>> 输出:True
从输出结果可知, lambda 函数同样属于可被调用的对象。

类是可被调用的吗?

从上面的分析,我们知道函数是可被调用的,字符串是不可被调用的,那么类是可被调用的吗?为了方便起见,我们不用创建特别的类,就用Python的内置几个类即可,比如strintdictlist,这些都是Python中最基本的类,更重要的是,它们都可以被紧跟其后的成对小括号来创建一个对象,比如我们常用的dict()等,因此,我们可猜测:它们都是可被调用的。下面来验证一下该结论:
types = [str, int, dict, list]for item in types:    print("{} | callable: {}".format(type(item), callable(item)))

2d7000e8078c12424cec4d00e8f37af6.png

从上述输出结果可知,这些基本类都是可被调用的,那么,我们自定义的类是否为可调用的呢?下面我们创建一个自定义类来看一下:
class person:    pass>>> callable(person)>>> 输出:True
上述结果表明,我们自定义的类也是可被调用的,也就是说person()这样的调用是被准许的。但由上述创建的类person实例化的一个对象是否还可被调用呢?我们来继续测试:
p1 = person()p1()

44cca929ce019381481d0ae19cd6a4b5.png

程序出错了,从错误提示来看,是说由person类创建的对象不具备可调用性。我们用callable()测试一下:
>>> callable(p1)>>> 输出:False
果然,person类的实例不能被调用,那么我们是否可以创建出一个可被调用的类实例呢? 答案依然是肯定的。

可被调用的类实例

Python中,有一个特别的方法叫做__call__,它可以帮我们实现刚才的想法,比如我们重新修改person类:
class person:    def __init__(self, name):        self.name = name            def __call__(self):        return "你好,{}!".format(self.name)
在上述类中,我们用 __init__ 方法完成对类实例的初始化,它接受一个名字做为新实例了名字,同时该类中也实现了 __call__ 方法,它使得创建的实例具备了可调用性:
>>> p2 = person("花花")>>> p2()>>> 输出:'你好,花花!'
非常棒!只要在所创建的类中实现__call__方法,则所创建的类实例便拥有了可调用的特性,也正是这样,才使得基于类创建“描述符函数”成为可能。

小结

在这篇文章中,我们分析了对象的可调用性,并介绍了用来测试对象是否可被调用的callable()函数,之后又研究了如何在普通的类中添加__call__方法来创建一个可被调用的类实例,这些内容属于Python知识点的较深度分析,供大家参阅。

相关文章:

  • c++ websocket客户端_golang websocket 客户端
  • stringbuilder可以被继承吗_老人去世后宅基地归谁?子女可以继承吗?
  • python dataframe的某一列变为list_手把手教你用Python爬中国电影票房数据
  • 网站迁移到新服务器的步骤_在网站改版期间如何避免SEO灾难
  • vue按需引入第三方插件_elementui组件按需引入踩过的坑
  • 3842开关电源完整原理图_详细分析开关电源输入端串联的电阻(作用/阻值/功率)...
  • python生成表格文件_【记录】Python中生成(写入数据到)Excel文件中
  • springboot jwt token前后端分离_4小时开发一个SpringBoot+vue前后端分离博客项目附带源码
  • idea serialversionuid怎么生成_这样设置 IDEA,让你爽到飞起!
  • 论文英文参考文献[10]的时候后面多空格_论文干货|论文新手别急,完整的论文写作没那么难...
  • python os open_[原创] python os.open()方法
  • idea构建springboot项目右边没有maven_你们要的干货来了——实战 Spring Boot
  • 使用python下载文件_使用Python下载文件(大文件,重定向文件)
  • 为什么python现在这么火_Python为什么这么火,您怎么看的?
  • python提示line3_python中使用tab键进行提示(python3有效)
  • 分享一款快速APP功能测试工具
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Apache的80端口被占用以及访问时报错403
  • idea + plantuml 画流程图
  • Map集合、散列表、红黑树介绍
  • ReactNative开发常用的三方模块
  • webgl (原生)基础入门指南【一】
  • 不上全站https的网站你们就等着被恶心死吧
  • 和 || 运算
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 那些年我们用过的显示性能指标
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 实战|智能家居行业移动应用性能分析
  • 使用common-codec进行md5加密
  • 算法之不定期更新(一)(2018-04-12)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​configparser --- 配置文件解析器​
  • #考研#计算机文化知识1(局域网及网络互联)
  • $jQuery 重写Alert样式方法
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (篇九)MySQL常用内置函数
  • (转) ns2/nam与nam实现相关的文件
  • (转)fock函数详解
  • (转)Linux整合apache和tomcat构建Web服务器
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net生成的类,跨工程调用显示注释
  • .Net语言中的StringBuilder:入门到精通
  • [BUUCTF 2018]Online Tool
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [c]扫雷
  • [C++] sqlite3_get_table 的使用
  • [C++基础]-入门知识
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!