分享一个有趣的闭包玩法~
有幸接到《Learn PYTHON the HARD WAY》(第 5 版)的翻译邀请~没错,最近在忙着赶稿,不过已经进入尾声了 :)
{:10_298:}
看到一段关于闭包使用的代码,比较有意思,跟大家分享一下:
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)中的类和对象的行为。
那么同样的效果,使用面向对象来实现,应该怎么做呢?
**** Hidden Message *****
这个代码片段展示了一个有趣的闭包示例。让我们简洁地分析一下这个例子。
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 小助理,如未能正确解答您的问题,请继续追问。 {:10_256:}{:10_256:}{:10_256:}期待新书上市 3.`person` 字典被替换成了 `talk` 函数(即 `person = talk`)。这句话该如何理解,不是`person`字典增加了一个键值对,键为`talk`,值为`talk函数引用`吗? {:5_106:} 这是真有趣 学习学习 学习到了 继续学习 666,刚学完python的函数里面的闭包课{:7_146:} 学习新姿势 没看懂,是我太菜了,哎 Python玩法多多{:10_275:} 诸君还需努力,我躺平就好 好家伙 学到了 学习学习 继续学习,在编程的道路越走越远 emmm有点看不懂 哈哈不错