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

  • 相关阅读:
    BZOJ-2431: [HAOI2009]逆序对数列 (傻逼递推)
    BZOJ3695 滑行
    BZOJ3689 异或之
    BZOJ3696 化合物
    BZOJ1393 [Ceoi2008]knights
    BZOJ2280 [Poi2011]Plot
    BZOJ1570 [JSOI2008]Blue Mary的旅行
    BZOJ2751 [HAOI2012]容易题(easy)
    BZOJ2818 Gcd
    BZOJ2426 [HAOI2010]工厂选址
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/10078841.html
Copyright © 2011-2022 走看看