Python中的callable是基于什么样的机制实现的

如题,在Python中有这样的方法callable,判断一个对象是否可以调用。

callable(object)
中文说明:检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

看看源码

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;
    }
}

其中

int PyInstance_Check(PyObject *obj)
Return true if obj is an instance.
判断是否为一个对象

对于最后一个else中

ternaryfunc PyTypeObject.tp_call
An optional pointer to a function that implements calling the object. This should be NULL if the object is not callable. The signature is the same as for PyObject_Call().
This field is inherited by subtypes.
指向函数的指针,用于callable检测

所以当用callable来检测一个类是否可调用,需要这个类有__call__,如果是一个方法,检测其tp_call。

两个比较

class a:
    def __call__(slef):
        pass
oa = a()
oa()
callable(oa)

结果为true

 class b:
     def _init__(self):
         pass
 ob=b()
 callable(ob)

结果为false

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值