Python中的可调用对象

作者: SHISHENGJIA | 来源:发表于2017-05-16 16:28 被阅读263次

    在Python中,除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上。如果想判断对象能否调用,可以使用内置的 callable() 函数。Python 数据模型文档列出了以下 7 种可调用对象。

    • 用户定义的函数
      使用 def 语句或 lambda 表达式创建
    • 内置函数
      使用 C 语言(CPython)实现的函数,如 len
    • 内置方法
      使用 C 语言实现的方法,如 dict.get
    • 方法
      在类的定义体中定义的函数

    • 调用类时会运行类的 __new__ 方法创建一个实 例,然后运行 __init__ 方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 new 运算符,所以调用类相当于调用函数。(通常,调用类会创建那个类的实例,不过覆盖 __new__ 方法的话,也可能出现其他行为。)
    • 类的实例
      如果类定义了 __call__方法,那么它的实例可以作为函数调用。
    • 生成器函数
      使用 yield 关键字的函数或方法。调用生成器函数返回的是生成器对象。

    下面看一下把类的实例变成可调用的对象,只需实现实例方法 __call__

    import random
    
    class BingoCage:
        def __init__(self, items):
            # 在本地构建一个副本,防止列表参数的意外副作用。
            self._items = list(items)
            # 将序列的元素随机排列
            random.shuffle(self._items)
    
        def pick(self):
            try:
                return self._items.pop()
            except IndexError:
                raise LookupError('pick from empty BingoCage')
    
        def __call__(self):
            return self.pick()
    
    bingo = BingoCage(range(3))
    print(bingo())
    print(callable(bingo))  # True
    

    实现 __call__ 方法的类是创建函数类对象的简便方式,此时必须在内部维护一个状态,让它在调用之间可用,例如 BingoCage 中的剩余元素。

    相关文章

      网友评论

        本文标题:Python中的可调用对象

        本文链接:https://www.haomeiwen.com/subject/xvxlxxtx.html