python 可调用对象之类实例

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

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函数内部,我们可以大大的简化我们的代码,不需要再针对的性的去做判断,这就是可调用实例类的用处之一。

原文地址:https://www.cnblogs.com/fiona-zhong/p/10078841.html