ajax如何傳後端一個物件_如何在Python中自定義一個可被呼叫的物件例項?
阿新 • • 發佈:2021-02-01
技術標籤: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()
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
的內建幾個類即可,比如str
、int
、dict
、list
,這些都是Python
中最基本的類,更重要的是,它們都可以被緊跟其後的成對小括號來建立一個物件,比如我們常用的dict()
等,因此,我們可猜測:它們都是可被呼叫的。下面來驗證一下該結論:
types = [str, int, dict, list]for item in types: print("{} | callable: {}".format(type(item), callable(item)))
從上述輸出結果可知,這些基本類都是可被呼叫的,那麼,我們自定義的類是否為可呼叫的呢?下面我們建立一個自定義類來看一下:
class person: pass>>> callable(person)>>> 輸出:True
上述結果表明,我們自定義的類也是可被呼叫的,也就是說person()
這樣的呼叫是被准許的。但由上述建立的類person
例項化的一個物件是否還可被呼叫呢?我們來繼續測試:
p1 = person()p1()
程式出錯了,從錯誤提示來看,是說由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
知識點的較深度分析,供大家參閱。