可调用对象,即任何可以通过函数操作符()来调用的对象。

python可调用对象大致可以分为4类:

1、函数

  python中有三种函数:内建函数(BIFs)、用户自定义函数(UDF)、lambda表达式

2、方法

  和函数类似,方法也有內建方法(BIM)和用户自定义方法(UDM)。用户自定义方法是被定义为类的一部分的函数;內建方法,如一个python数据类型如列表和字典,也有方法,这些方法就叫做内建方法。

    內建方法和内建函数不同之处在于,內建方法的__self__属性指向一个python对象,而内建函数的__self__指向None

3、类

  实例化

4、某些类的实例

  python给类创建了__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()是没有实现的,即大多数的类的实例是不可调用的。而如果类中实现了这个方法,那么这个类的实例就成了可调用的了。

  调用这样的实例等同于调用__call__()方法。

这里主要讲一下可调用实例的作用:

1、可以简化对象下方法的调用

  如foo 类实现了__call__()方法,那么调用 foo() 和调用foo.__call__()是一样的。

  这种使用与当对象下面只有一个方法的时候,或者对象下某个方法被使用很多次的情况下。

2、模糊了对象和函数的区别,这个具体有什么用呢?看个例子:

  class A():

    def get():

      return object()

  class B():

    def run():

      return object()

  

  def foo():

    return object()

  上面创建了两个类和一个函数,现在我需要定义main函数,接收一个参数,并得到object对象

  def Main(param):

    # 如果param为A

    param.get()

    # 如果param为B

    param.run()

    # 如果param为foo

    param()

  Main(A())

  Main(B())

  Main(foo)

  要完成这个需求,通过上面三种方式去分别调用,且需要在main函数内部去判断,当前调用的是哪个类

  那么如果我把上面的三种情况换成可调用对象实例的方式去完成呢?

  class A():

    def __call__():

      return object()

  class B():

    def __call__():

      return object()

  def foo():

    return object()

  这样改写后,同样要实现上面的需求,我们需要怎么做呢?

  def Main(callableFun):

    callableFun()

  Main(A())

  Main(B())

  Main(foo)

  可以看到,在main函数内部,我们可以大大的简化我们的代码,不需要再针对的性的去做判断,这就是可调用实例类的用处之一。

python 可调用对象之类实例的更多相关文章

  1. python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

    1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过“类名()”的方式实例 ...

  2. python之 类对象 类方法 实例对象 实例方法 静态方法

    实例对象1. 创建的时间:使用 类名()的时候,就创建一个实例对象2. 实例属性:怎样添加 只要是一个变量能够指向这个实例对象,那么这个变量.xxxx = 111就是给其添加一个实例属性 特点: 跟着 ...

  3. Python 可调用对象

    除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上.如果想判断对象能否调用,可以使用内置的 callable() 函数.Python 数据模型文档列出了 7 种可调用对象.(1)用户定义 ...

  4. python面向对象编程对象和实例的理解

    给你一个眼神,自己体会

  5. Python深入03 对象的属性

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python一切皆对象(object),每个对象都可能有多个属性(attribut ...

  6. Python类与对象的理解

    注意python的类对象与实例对象的区分 类对象与实例对象是相对的,例如:a=1,那么a就是int的一个实例对象,这里的a相对于int来说,a是实例对象,int是类对象.但是int同时又是type的实 ...

  7. python—类对象和实例对象的区别

    最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行 ...

  8. Python中的7种可调用对象

    Python中有七种可调用对象,可调用对象可使用内置函数callable来检测 一.用户自定义的函数: 使用def语句或者lambda表达式创建的函数. 二.内置函数: 使用C语言实现的函数,如len ...

  9. python之对象(实例)

    1.对象是关于类而实际存在的一个例子,即实例 #类实例化得到g1这个实例 class Garen: camp='Demacia' def __init__(self,nickname,aggressi ...

随机推荐

  1. [转] Scala 中的异步事件处理

    在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法 ...

  2. Orchard详解--第五篇 CacheManager

    上一篇文章介绍了Orchard中的缓存,本篇主要针对CacheManager进行分析,CacheManager在Orchard中用于存储应用程序的配置信息以及框架内部的一些功能支持,包括整个拓展及拓展 ...

  3. [20180914]oracle 12c 表 full_hash_value如何计算.txt

    [20180914]oracle 12c 表 full_hash_value如何计算.txt --//昨天在12c下看表full_hash_value与11g的full_hash_value不同,不过 ...

  4. Winform调用webapi

    /// <summary> /// 调用api返回json /// </summary> /// <param name="url">api地址 ...

  5. Linux下键盘值 对应input_evnet的code值。

    最近做了一个linux下面的模拟鼠标和键盘的app,但不是很清楚字符对应的键值:查找内核源码,在kernel/include/uapi/linux/input.h文件中找到: 下面给出普通键盘上面对应 ...

  6. 【PAT】B1011 A+B 和 C

    注意数据的范围,使用long long就行了 #include<stdio.h> int main(){ int N;scanf("%d",&N); for(i ...

  7. 文件上传漏洞靶场:upload-labs安装及第一关教程

    注:本文仅供学习使用,请勿用于非法操作,后果与作者无关!!! 一.简介 upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场.旨在帮助大家对上传漏洞有一个全 ...

  8. puppet 横向扩展(二)

    Table of Contents 1. 概述 2. 实验环境 3. 实验步骤 3.1. 机器B 的环境 3.1.1. 安装puppetmaster 以及 apache passenger 3.1.2 ...

  9. python 浅谈字典dict

    一.字典简介 字典(dict)是python中唯一的映射类型,他是以{ }括起来的键值对组成,在dict中的key是唯一的.在保存的时候,根据key来计算出一个内存地址.然后将key-value保存在 ...

  10. C#基础知识之键盘对应的键值

    1.一般的按键禁用 一般的按键禁用只要找出相应的keycode禁用即可.例如:window.event.keyCode==13 //Enter键 其他可以对照一下的keyCode进行选择. 字母和数字 ...