python callable学习记录

 callable(object):如果参数object是可调用的,返回True,否则返回False。如果返回真,调用仍可能会失败;但如果返回假,则调用object必定失败。调用类是可调用的(调用类会返回一个新的实例)。如果实例的类有__call__()方法,则它是可调用的。如下栗子中,展示了四种情况:

  1. 调用一个常量,则返回False
  2. 调用自身函数,返回True
  3. 调用类,如果该类实现了回调方法,则返回True
  4. 调用子类实例对象,则返回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__内置函数特性,可以实现基于类的装饰器功能;

beb54a3ed0a6d9d7044a0be7539cbd6e6b9.jpg

而我们知道,在python中所有的东西都被称为对象,SVM支持向量机提供可自定义内核函数,如:

cb4b8759acb5cd57045ef004238826bb751.jpg

既然一切东西都是对象,那么,python中函数也不例外,因此,在支持向量机中,如果用户自定义内核函数,那它一定是可调用对象,因为我们大量调用它,通过func()、func(arg1 ...) 等形式,如上is_callback(is_callback)为一个可调用对象 即函数is_callback默认实现了__call__()方法

转载于:https://my.oschina.net/FXLoba/blog/3075154

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值