當我們將函數(shù)作為參數(shù)傳遞時,實際傳遞的是一個可調(diào)用對象,我們要執(zhí)行該函數(shù)對象
也很簡單主胧,執(zhí)行在函數(shù)對象兩側(cè)加()
即可。
def say():
print('Hello ')
def my_say(start):
start()
print('World!')
if __name__ == '__main__':
my_say(say)
# Hello
# World!
在上面的例子中习勤,我們在my_say
中執(zhí)行了say
函數(shù)踪栋。
一、Python
中共有7
中可調(diào)用對象图毕。
- 1.
用戶自定義的函數(shù)
使用def
語句或lambda
表達式創(chuàng)建.
def fn():
pass
if __name__ == '__main__':
print(type(fn)) # <class 'function'>
- 2.
內(nèi)置函數(shù)
使用 C 語言(CPython
)實現(xiàn)的函數(shù)夷都,如len
或time.strftime
。
if __name__ == '__main__':
print(type(max)) # <class 'builtin_function_or_method'>
- 3.
內(nèi)置方法
使用 C 語言實現(xiàn)的方法予颤,如dict.get
囤官。
if __name__ == '__main__':
print(type(dict.get)) # <class 'method_descriptor'>
- 4.
方法
在類的定義體中定義的函數(shù)。
class Student:
def study(self):
print('學(xué)習(xí)蛤虐,學(xué)個屁党饮!')
if __name__ == '__main__':
print(type(Student().study)) # <class 'method'>
5.
類
對類
添加()
會生產(chǎn)實例對象。所以類也是可調(diào)用的對象驳庭。6.
類的實例
如果類定義了 call 方法刑顺,那么它的實例可以作為函數(shù)調(diào)用。
class Student:
def study(self):
print('學(xué)習(xí)饲常,學(xué)個屁蹲堂!')
def __call__(self, *args, **kwargs):
print('執(zhí)行對象調(diào)用!')
if __name__ == '__main__':
student = Student()
student() # 執(zhí)行對象調(diào)用贝淤!
這里如果沒有實現(xiàn)__call__
方法柒竞,則會報錯
TypeError: 'Student' object is not callable
- 7.
生成器函數(shù)
二、因此判斷對象能否調(diào)用
Python
中有各種各樣可調(diào)用的類型播聪,因此判斷對象能否調(diào)用朽基,最安全的方法是使用內(nèi) 置的 callable()
函數(shù):
>>> abs, str, 13
(<built-in function abs>, <class 'str'>, 13)
>>> [callable(obj) for obj in (abs, str, 13)]
[True, True, False]