什么叫可调用,这个对象,可以 通过某种方法 执行,或者说 这个对象
对象.(*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 "", 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__
。