博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019.5.6_普通的一天_用户定义的可调用类型
阅读量:6955 次
发布时间:2019-06-27

本文共 1105 字,大约阅读时间需要 3 分钟。

摘自《流畅的Python》


用户定义的可调用类型

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

下例实现了BingoCage类,这个类的实例使用任何可迭代对象构建,而且会在内部存储一个随机顺序排列的列表。调用实例会取出一个元素。

# 调用BingoCage实例,从打乱的列表中取出一个元素import randomclass BingoCage:	def __init__(self, items):        # __init__接受任何可迭代对象,在本地构建一个副本,防止列表参数的意外副作用                self._items = list(items)        random.shuffle(self._item)    	# shuffle 一定能完成工作,因为self._items 是列表        def pick(self): # 此为起主要作用的方法        try:            return self._items.pop()        expect IndexError:            raise LookupError('pick from empty BingoCage')            # 如果self._items 为空,抛出异常,并设定错误信息    def __call__(self):        # bingo.pick() 的快捷方式是bingo()        return self.pick()    	# 请思考此处为啥是 self.pick() 而不是 self.pick复制代码

接下来是上例定义的类的简单演示。注:bingo实例可以作为函数调用,而且内置的callable(...)函数判定它是可调用对象:

>>> bingo = BingoCage(range(3))>>> bingo.pick()1>>> bingo()0>>> callable(bingo)True复制代码

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

创建保有内部状态的函数,还用一种截然不同的方式——使用闭包。之后再谈,哈哈!

明天说,把函数视为对象处理的另一方面:运行时内省。

转载地址:http://pzxil.baihongyu.com/

你可能感兴趣的文章
AIP(Azure 信息保护)之三:保护Office文件
查看>>
Java观察者模式(Observer模式)
查看>>
html5 流程条
查看>>
C#数据类型
查看>>
超150年老字号企业中国仅5家,日本上万
查看>>
永中Office-灵活的斜线表头
查看>>
hibernate映射插件
查看>>
Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决
查看>>
oracle ORA-30926
查看>>
简析IMAP协议
查看>>
分享一个web应用程序池管理工具
查看>>
用shell实现简单的IDS检测系统
查看>>
Syngress.Nmap.in.the.Enterprise.Your.Guide.to.Network.Scanning
查看>>
GlusterFS 存储结构原理介绍
查看>>
asp.net 初学
查看>>
在代码中设置TextView的drawableLeft、drawableRight、drawableTop、drawableBottom
查看>>
数据管理平台范围
查看>>
MySQL的EXPLAIN命令用法
查看>>
iOS错误之“A valid provisioning profile for this executable was not found”
查看>>
jquery实现Ajax
查看>>