当我们将函数作为参数传递时,实际传递的是一个可调用对象,我们要执行该函数对象
也很简单,执行在函数对象两侧加()
即可。
def say():
print('Hello ')
def my_say(start):
start()
print('World!')
if __name__ == '__main__':
my_say(say)
# Hello
# World!
在上面的例子中,我们在my_say
中执行了say
函数。
一、Python
中共有7
中可调用对象。
- 1.
用户自定义的函数
使用def
语句或lambda
表达式创建.
def fn():
pass
if __name__ == '__main__':
print(type(fn)) # <class 'function'>
- 2.
内置函数
使用 C 语言(CPython
)实现的函数,如len
或time.strftime
。
if __name__ == '__main__':
print(type(max)) # <class 'builtin_function_or_method'>
- 3.
内置方法
使用 C 语言实现的方法,如dict.get
。
if __name__ == '__main__':
print(type(dict.get)) # <class 'method_descriptor'>
- 4.
方法
在类的定义体中定义的函数。
class Student:
def study(self):
print('学习,学个屁!')
if __name__ == '__main__':
print(type(Student().study)) # <class 'method'>
5.
类
对类
添加()
会生产实例对象。所以类也是可调用的对象。6.
类的实例
如果类定义了 call 方法,那么它的实例可以作为函数调用。
class Student:
def study(self):
print('学习,学个屁!')
def __call__(self, *args, **kwargs):
print('执行对象调用!')
if __name__ == '__main__':
student = Student()
student() # 执行对象调用!
这里如果没有实现__call__
方法,则会报错
TypeError: 'Student' object is not callable
- 7.
生成器函数
二、因此判断对象能否调用
Python
中有各种各样可调用的类型,因此判断对象能否调用,最安全的方法是使用内 置的 callable()
函数:
>>> abs, str, 13
(<built-in function abs>, <class 'str'>, 13)
>>> [callable(obj) for obj in (abs, str, 13)]
[True, True, False]