python中什麼是 可調用的,什麼是不可調用的?

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__

分享快樂,留住感動. 2020-03-24 07:30:19 --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章