python中什麼是 可調用的,什麼是不可調用的?
概念介紹
什麼叫可調用,這個對象,可以 通過某種方法 執行,或者說 這個對象
對象.(*args,**kw)
如果這個方法 可以執行 那麼我們就說 這個對象是可調用的。
在python中最常見的 比如函數 ,方法 ,這些都是可以調用的 因爲這些都可以通過上述方法執行 。
函數是可調用的嗎
比如我定義一個函數,他可以通過 函數名()
這種方式 執行 函數裏面的代碼段,這個函數我們就說 是可以調用的。
還有一個更加直觀的方法 就是 直接 使用系統內置函數callable
來判斷是不是可調用的。這個函數返回 True 就表明這個 函數是可調用的。
>>> def pickup():
... pass
...
>>> pickup()
>>> callable(pickup)
True
類是可調用的嗎
咱們來說一下類 , 你覺得類 是可調用的嗎? 由類生成的對象 是可調用的嗎?
class Person:
def __init__(self, name='frank'):
self.name = name
def sing(self):
print(f"{self.name} is singing")
首先說一下 結論 ,對於這個類而言 , Person 類 是可調用的。而由Person 生成的對象 是不可調用的。
>>> class Person:
... def __init__(self, name='frank'):
... self.name = name
...
... def sing(self):
... print(f"{self.name} is singing")
...
>>> callable(Person)
True
>>> p = Person()
>>> callable(p)
False
>>> p()
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'Person' object is not callable
>>> callable(p.sing)
True
>>> p.sing()
frank is singing
首先還是用剛剛我說的方法 判斷 , Person 是不是可調用的, 只要看看 Person(*args,**kw)
這個能不能正常執行, 很明顯 是可以執行, 用它來構造一個Person 的對象 p , 所以 我們 說 Person 是可以執行的 。
對於對象p
而言 ,只要看p(*arg,**kw)
能不能執行, 顯然 這個例子 不能執行 。 所以我們說 對象 p 不能調用。
而對於對象p
的 成員方法 sing而言 , p.sing()
這個顯然 是可以執行的, 所以 對象p的成員方法 sing 是可以調用的。
那麼問題來了, 對於一個對象 如何 從一個 不可調用 轉換成 可調用的呢? 就是 實現魔術方法 __call__
稍微改造一下這個類,讓 p
變成一個 可調用的對象 呢?
class Person:
def __init__(self, name='frank'):
self.name = name
def sing(self):
print(f"{self.name} is singing")
# 添加這個魔術方法
def __call__(self, *args, **kwargs):
self.sing()
在控制檯 演示一下:
>>> p = Person()
>>> p
<__main__.Person object at 0x000001786F29BBC8>
>>> callable(p)
True
>>> p()
frank is singing
這個時候 可以通過 p()
這種方式 執行代碼,我們就認爲 對象 p 是可調用的。 當我們 執行 p()
實際上 執行就是魔術方法 __call__
裏面 的代碼 ,這裏等同於 是這樣的調用關係 p() == p.___call__()
總結
一般情況 在python 中 函數,方法 類 都是可調用的 。至於 由類生成的對象,是否 是可調用的,主要是看 類中是否實現 魔術方法 __call__
。