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

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. hadoop,spark,Zookeeper,,, 这些名字都是怎么来的呢?

    Apache 首先我们要明白,Apache 是一个 http 服务器,而我们熟悉的另一种说法"Apache Hadoop"中的 Apache 则指的是 Apache 软件基金会.& ...

  2. Scala依赖注入

    控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合程度.其中最常见的方式叫做依赖注入(Dependency Inject ...

  3. ORACLE Index Lookup索引访问路径总结

    在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...

  4. IIS ip访问限制插件

    Dynamic IP Restrictions Overview The Dynamic IP Restrictions Extension for IIS provides IT Professio ...

  5. SQL Server 提供的各种数据访问接口

    在创建SQL Server的链接服务器时,可以看到有如下几种访问接口,其中我们常用的只有1.3.4.6.其中4是安装Oracle客户端才会出现的接口,3.6是由于我电脑上装了2008R2和2012两个 ...

  6. visual Studio 中使用正则表达式来进行查找替换

    1.打开visual Studio 2. 通过菜单Edit -->Find and Replace -->Replace In File  ,或者使用  ctrl + Shift + H  ...

  7. ubuntu 安装FoxitReader福昕阅读器(转载)

    虽然不怎么用Ubuntu来看文档,但是偶尔还是需要看一下的.而Ubuntu自带的打开PDF的软件真的看着很难受,装一个跨平台的福昕好了. 首先,下载.可以官网下载:福昕官网 不过晚上不知道网络抽风还是 ...

  8. 我的游戏学习日志3——三国志GBA

    我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...

  9. HTTP Health Checks

    This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...

  10. 【BZOJ3451】Normal

    [BZOJ3451]Normal Description 某天WJMZBMR学习了一个神奇的算法:树的点分治! 这个算法的核心是这样的: 消耗时间=0 Solve(树 a) 消耗时间 += a 的 大 ...