1. 程式人生 > >python 可呼叫物件之類例項

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函式內部,我們可以大大的簡化我們的程式碼,不需要再針對的性的去做判斷,這就是可呼叫例項類的用處之一。