鱼C论坛

 找回密码
 立即注册
查看: 1725|回复: 55

[技术交流] 分享一个有趣的闭包玩法~

[复制链接]
发表于 2024-9-1 23:16:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有幸接到《Learn PYTHON the HARD WAY》(第 5 版)的翻译邀请~

没错,最近在忙着赶稿,不过已经进入尾声了 :)



看到一段关于闭包使用的代码,比较有意思,跟大家分享一下:
def Person_new(name, age, eyes): 
    person = {
        "name": name,
        "age": age,
        "eyes": eyes,
}

    def talk(words):
        print(f"I am {person['name']} and {words}")
    
    person['talk'] = talk
    
    return person

becky = Person_new("Becky", 39, "green") 
becky['talk']("I am talking here!")
这段代码的写法比较有趣,通过将函数嵌入字典的方式实现了类似于面向对象编程中的方法绑定。

最终,becky 是一个包含属性(name, age, eyes)和方法(talk)的字典对象。

说白了,它是在模拟面向对象编程(OOP)中的类和对象的行为。

那么同样的效果,使用面向对象来实现,应该怎么做呢?

游客,如果您要查看本帖隐藏内容请回复


评分

参与人数 1鱼币 +5 收起 理由
某一个“天” + 5 无条件支持甲鱼哥

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-1 23:16:55 | 显示全部楼层
这个代码片段展示了一个有趣的闭包示例。让我们简洁地分析一下这个例子。

1. `Person_new` 函数接收三个参数:`name`、`age` 和 `eyes`,并创建了一个包含这些信息的 `person` 字典。
2. 在 `Person_new` 函数内部定义了一个 `talk` 函数,该函数可以访问 `person` 字典。
3. 然后,`person` 字典被替换成了 `talk` 函数(即 `person = talk`)。
4. 最后,`Person_new` 函数返回了 `talk`(现被赋值给 `person`)。

调用 `Person_new` 后,得到的是 `talk` 函数,而不是原来的 `person` 字典。

代码执行顺序:
becky = Person_new("Becky", 39, "green")
上面的代码相当于:
becky = talk
执行
becky("I am talking here!")
等同于调用 `talk("I am talking here!")`。闭包使得 `talk` 函数内能够访问 `person` 字典,即使在 `talk` 函数已脱离 `Person_new` 函数之后。

输出结果为:
I am {'name': 'Becky', 'age': 39, 'eyes': 'green'} and I am talking here!

这样,利用闭包,你可以在函数外部访问并保持某些内部状态。而且,用这种方式可以创建更复杂和动态的对象行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 09:25:49 | 显示全部楼层
期待新书上市
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 09:55:01 | 显示全部楼层
3.`person` 字典被替换成了 `talk` 函数(即 `person = talk`)。这句话该如何理解,不是`person`字典增加了一个键值对,键为`talk`,值为`talk函数引用`吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 13:16:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-2 21:19:06 From FishC Mobile | 显示全部楼层
这是真有趣
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:19:08 From FishC Mobile | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:19:37 From FishC Mobile | 显示全部楼层
学习到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:19:39 From FishC Mobile | 显示全部楼层
继续学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:20:34 | 显示全部楼层
666,刚学完python的函数里面的闭包课
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:21:42 From FishC Mobile | 显示全部楼层
学习新姿势
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:23:02 | 显示全部楼层
没看懂,是我太菜了,哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:23:21 | 显示全部楼层
Python玩法多多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:24:14 | 显示全部楼层
诸君还需努力,我躺平就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:24:28 From FishC Mobile | 显示全部楼层
好家伙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:25:56 From FishC Mobile | 显示全部楼层
学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:27:00 From FishC Mobile | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:28:31 From FishC Mobile | 显示全部楼层
继续学习,在编程的道路越走越远
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:28:45 From FishC Mobile | 显示全部楼层
emmm有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 21:32:30 From FishC Mobile | 显示全部楼层
哈哈不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表