什么是Python中的“可调用”?


什么是Python中的“可调用”?

可调用是可以调用的任何东西。

所述内置的可调用(PyCallable_Check在objects.c)检查该参数可以是:

  • 带有call方法或类的类的实例
  • 是一个具有非null tp_call(c struct)成员的类型,否则表示可调用性(例如在函数,方法等中)名为call的方法

例如

class Foo:
  def __call__(self):
    print 'called'

foo_instance = Foo()
foo_instance() #this is calling the __call__ method

从Python的源代码object.c:

/* Test whether an object can be called */

int
PyCallable_Check(PyObject *x)
{
    if (x == NULL)
        return 0;
    if (PyInstance_Check(x)) {
        PyObject *call = PyObject_GetAttrString(x, "__call__");
        if (call == NULL) {
            PyErr_Clear();
            return 0;
        }
        /* Could test recursively but don't, for fear of endless
           recursion if some joker sets self.__call__ = self */
        Py_DECREF(call);
        return 1;
    }
    else {
        return x->ob_type->tp_call != NULL;
    }
}

它说:

  • 如果一个对象是某个类的实例,那么如果它具有call属性,则它是可调用的。
  • 否则该对象x可以调用iff x->ob_type->tp_call != NULL