python定义可调用的类型

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

  • 使用 def 语句或 lambda 表达式创建
  • 内置函数:使用 C 语言(CPython)实现的函数,如 len 或 time.strftime。
  • 内置方法:使用 C 语言实现的方法,如 dict.get。
  • 方法:在类的定义体中定义的函数。
  • 类:调用时会运行类的 __new__ 方法创建一个实例,然后运行 __init__ 方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 new 运算符,所以调用类相当于调用函数。
  • 类的实例: 如果类定义了 __call__ 方法,那么它的实例可以作为函数调用。
  • 生成器函数: 使用 yield 关键字的函数方法。调用生成器函数返回的是生成器对象

用户定义的可调用类型

不仅 Python 函数是真正的对象,任何 Python 对象都可以表现得像函数。为此,只需实现实例方法 __call__

import random


class BingoCage:

    def __init__(self, items):
        # __init__ 接受任何可迭代对象;在本地构建一个副本,防止列表参数的意外副作用。
        self._items = list(items)
        # shuffle 定能完成工作,因为 self._items 是列表。
        random.shuffle(self._items)

    def pick(self):  # 起主要作用的方法。
        try:
            return self._items.pop()
        except IndexError:  # 如果 self._items 为空,抛出异常,并设定错误消息。
            raise LookupError('pick from empty BingoCage')

    def __call__(self):  # bingo.pick() 的快捷方式是 bingo()
        return self.pick()


if __name__ == '__main__':
    bingo = BingoCage(range(3))
    print(bingo.pick())
    # 0
    print(bingo())
    # 2
    print(callable(bingo))
    # True






实现 __call__ 方法的创建函数类对象简便方式,此时必须在内部维护一个状态,让它在调用之间可用,例如 BingoCage 中的剩余元素。装饰器就是这样。装饰器必须是函数,而且有时要在多次调用之间“记住”某些事 [ 例如备忘(memoization),即缓存消耗大的计算结果,供后面使用。

创建保有内部状态的函数,还有一种截然不同的方式——使用闭包

相关推荐

  1. python定义调用类型

    2024-01-21 23:38:03       30 阅读
  2. python函数定义调用

    2024-01-21 23:38:03       27 阅读
  3. Python定义调用函数

    2024-01-21 23:38:03       12 阅读
  4. C++语法|调用对象与function类型

    2024-01-21 23:38:03       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-21 23:38:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-21 23:38:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-21 23:38:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-21 23:38:03       18 阅读

热门阅读

  1. Debezium发布历史77

    2024-01-21 23:38:03       34 阅读
  2. QT上位机开发(Web API联调)

    2024-01-21 23:38:03       32 阅读
  3. gin中使用JWT

    2024-01-21 23:38:03       37 阅读
  4. c#怎么访问 devexpress.xtrabars.barbuttonitem

    2024-01-21 23:38:03       34 阅读