1. 程式人生 > 其它 >ajax如何傳後端一個物件_如何在Python中自定義一個可被呼叫的物件例項?

ajax如何傳後端一個物件_如何在Python中自定義一個可被呼叫的物件例項?

技術標籤:ajax如何傳後端一個物件

前言

在關於Python描述符函式的詳解三篇中,我們有提到如何基於類建立一個“描述符函式”,之所以能夠基於類建立這樣一個概念,是因為用到了類中的__call__屬性,從前述文章中可知,當類中定義了__call__屬性時,基於該類所建立的物件就成為一個可被呼叫的函式。這樣的做法我們已經知道,可是這中間的執行機制是怎樣的呢?這一篇文章中,我們將從函式的可被呼叫性入手來深入分析一下。

Python中的可呼叫操作符

當我們談到在Python中呼叫一個函式時,通常指的是在特定函式名後緊跟一對小括號,當然如果有引數的話,將引數包括在小括號中,甚至有人將函式名後的成對小括號稱為“呼叫操作符”,如果函式名後不帶成對小括號,那麼Python
直譯器只是給出這是一個函式的提示,並不會執行它,比如先定義一個函式say_hello
def say_hello():    print("Hello Python!")
當不帶對成小括號時:
say_hello輸出:<function__main__.say_hello()>
從上述輸出可知,Python直譯器只是告訴我們say_hello是一個函式,如果帶上成對小括號,那麼該函式就會被執行:
say_hello()輸出:Hello Python!
很顯然,所有的函式都是可被呼叫的。 但是當任意給出一個物件時,我們如何知道它是否可以被呼叫呢? 難道要對每一個給定的物件都帶上成對小括號進行測試嗎? 如果真是這樣的話,我們來看看那些不能被呼叫的物件帶上成對小括號後,結果會怎樣,比如我們來定義一個字串,看看字串是否可被呼叫:
hello = "Hello, Python!"hello()

ee9295796517ce63af9cf0e4800b8ff4.png

上述程式碼在執行時 被直譯器報出錯誤,從提示來看,是說 str 物件不具備可呼叫性,那麼,有沒有一種方便的方法來測試哪些物件可被呼叫,哪些又不可被呼叫呢? 答案是肯定,那就是callable()函式。

callable()函式

Python的內建函式中,有一個callable()函式恰好是專門用來測試一個物件是否可被呼叫,當該物件可被呼叫時,它返回True,否則返回False,比如我們用它來測試一下上面建立的函式say_hello()函式和hello字串:
>>> callable(say_hello)>>>輸出:True>>> callable(hello)>>> 輸出:False
在之前的文章中,我們知道lambda函式是匿名函式,那麼這類函式是可被呼叫的嗎?下面一個例子可給出說明:
>>> callable(lambda x: x*x)>>>輸出:True
從輸出結果可知, lambda 函式同樣屬於可被呼叫的物件。

類是可被呼叫的嗎?

從上面的分析,我們知道函式是可被呼叫的,字串是不可被呼叫的,那麼類是可被呼叫的嗎?為了方便起見,我們不用建立特別的類,就用Python的內建幾個類即可,比如strintdictlist,這些都是Python中最基本的類,更重要的是,它們都可以被緊跟其後的成對小括號來建立一個物件,比如我們常用的dict()等,因此,我們可猜測:它們都是可被呼叫的。下面來驗證一下該結論:
types = [str, int, dict, list]for item in types:    print("{} | callable: {}".format(type(item), callable(item)))

8b04776690699f3ca9e479a20fda898d.png

從上述輸出結果可知,這些基本類都是可被呼叫的,那麼,我們自定義的類是否為可呼叫的呢?下面我們建立一個自定義類來看一下:
class person:    pass>>> callable(person)>>> 輸出:True
上述結果表明,我們自定義的類也是可被呼叫的,也就是說person()這樣的呼叫是被准許的。但由上述建立的類person例項化的一個物件是否還可被呼叫呢?我們來繼續測試:
p1 = person()p1()

d1908cb73f55832ffe366f16f45a11f6.png

程式出錯了,從錯誤提示來看,是說由person類建立的物件不具備可呼叫性。我們用callable()測試一下:
>>> callable(p1)>>>輸出:False
果然,person類的例項不能被呼叫,那麼我們是否可以創建出一個可被呼叫的類例項呢? 答案依然是肯定的。

可被呼叫的類例項

Python中,有一個特別的方法叫做__call__,它可以幫我們實現剛才的想法,比如我們重新修改person類:
class person:    def __init__(self, name):        self.name = name            def __call__(self):        return "你好,{}!".format(self.name)
在上述類中,我們用 __init__ 方法完成對類例項的初始化,它接受一個名字做為新例項了名字,同時該類中也實現了 __call__ 方法,它使得建立的例項具備了可呼叫性:
>>> p2 = person("花花")>>> p2()>>>輸出:'你好,花花!'
非常棒!只要在所建立的類中實現__call__方法,則所建立的類例項便擁有了可呼叫的特性,也正是這樣,才使得基於類建立“描述符函式”成為可能。

小結

在這篇文章中,我們分析了物件的可呼叫性,並介紹了用來測試物件是否可被呼叫的callable()函式,之後又研究瞭如何在普通的類中新增__call__方法來建立一個可被呼叫的類例項,這些內容屬於Python知識點的較深度分析,供大家參閱。