callable(object):如果参数object是可调用的,返回True,否则返回False。如果返回真,调用仍可能会失败;但如果返回假,则调用object必定失败。调用类是可调用的(调用类会返回一个新的实例)。如果实例的类有__call__()方法,则它是可调用的。如下栗子中,展示了四种情况:
- 调用一个常量,则返回False
- 调用自身函数,返回True
- 调用类,如果该类实现了回调方法,则返回True
- 调用子类实例对象,则返回True,继承关系,其父类实现了__call__()方法
def is_callback(func):
if callable(func):
print(func, "is callable")
else:
print(func, "is not callable")
class A:
def __init__(self, value):
self.value = value
def modify_attr(self, value):
self.value = value
class B(A):
def __init__(self):
pass
def __call__(self, value):
return value
class C(B):
def __init__(self, val):
self.val = val
def print(self, val):
self.val = val
print(self.val)
print(" is callable?")
a = A(2)
b = B()
c = C(2)
is_callback(0)
is_callback("String")
is_callback(callable)
is_callback(list)
is_callback(is_callback)
is_callback(a)
is_callback(b)
is_callback(c)
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/fxl/PycharmProjects/BERT-train2deploy/test/callback/test_callback.py
0 is not callable
String is not callable
<built-in function callable> is callable
<class 'list'> is callable
<function is_callback at 0x1035601e0> is callable
<__main__.A object at 0x1035f9320> is not callable
<__main__.B object at 0x103603400> is callable
<__main__.C object at 0x103acbd68> is callable
Process finished with exit code 0
二、起源:学习sklearn中SVM支持向量机,看到源码中,使用大量内核参数使用callable内置函数做校验,因此特地探究下它;
目的:为什么要对支持向量机内核函数使用callable判断;
我们从上面callable用例了解到,可调用对象方法,执行__call__内置函数,利用__call__内置函数特性,可以实现基于类的装饰器功能;
而我们知道,在python中所有的东西都被称为对象,SVM支持向量机提供可自定义内核函数,如:
既然一切东西都是对象,那么,python中函数也不例外,因此,在支持向量机中,如果用户自定义内核函数,那它一定是可调用对象,因为我们大量调用它,通过func()、func(arg1 ...) 等形式,如上is_callback(is_callback)为一个可调用对象 即函数is_callback默认实现了__call__()方法