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-复盘-特殊方法__call__

    在Python中,函数其实是一个对象: 由于f可以被调用,所以,f 被称为可调用对象。 所有的函数都是可调用对象。...

  • 可调用对象

    我们知道在Python中,函数是一个对象。由于函数可以被调用,所以函数被称为可调用对象。所有的函数都是可调用对象。...

  • Python中的类装饰器

    1,对象能不能被调用 在Python中对象一般是不可以被调用的, person=Person() ,person(...

  • Python中的可调用对象

    在Python中,除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上。如果想判断对象能否调用,可以使...

  • 小白学 python之——读写文件

    在Python 中,读写文件有3 个步骤:1.调用open()函数,返回一个File 对象。2.调用File 对象...

  • Python装饰器1-可调用对象

    python可调用对象以及函数概念 在Python中,除了用户定义的函数,调用运算符(即 ())还可以应用到其他对...

  • python 面向对象: super()

    python 关于 super 的使用 子类对象调用父类方法 :super(B,b).hh() 子类中调用父类方法...

  • Python装饰器12-类的__call__方法

    Python中万物皆对象,对象分为可调用和不可调用,可调用就是一个对象名称后面可以跟(),如之前所说装饰器语法糖必...

  • 理解Python中的闭包

    Python基础 在Python中,函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。...

  • C++调用python

    C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可...

网友评论

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

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