Python中的可调用对象

在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 中的剩余元素。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,601评论 0 6
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,538评论 6 53
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,632评论 1 118
  • 感恩节那天是我最后一天休假。趁着假期,我去接小小悦放学。 我跟小小悦说,今天感恩节,我想谢谢你! 谢谢你可以照顾自...
    悦书_王小悦阅读 254评论 1 2
  • 从前觉得需要大哭一场发泄便肆无忌惮的哭 现在难过到窒息也不随便在人前哭知道了哭解决不了任何问题有时候真的只需要偷偷...
    九月虫阅读 226评论 0 1