小甲鱼 发表于 2024-9-1 23:16:46

分享一个有趣的闭包玩法~

有幸接到《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 *****

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2024-9-2 09:25:49

{:10_256:}{:10_256:}{:10_256:}期待新书上市

2023zc 发表于 2024-9-2 09:55:01

3.`person` 字典被替换成了 `talk` 函数(即 `person = talk`)。这句话该如何理解,不是`person`字典增加了一个键值对,键为`talk`,值为`talk函数引用`吗?

sunshine_8205 发表于 2024-9-2 13:16:31

{:5_106:}

clollipops 发表于 2024-9-2 21:19:06

这是真有趣

kounasx 发表于 2024-9-2 21:19:08

学习学习

格子penbeat 发表于 2024-9-2 21:19:37

学习到了

想个好名字@ 发表于 2024-9-2 21:19:39

继续学习

daisyyuqing 发表于 2024-9-2 21:20:34

666,刚学完python的函数里面的闭包课{:7_146:}

zhae89 发表于 2024-9-2 21:21:42

学习新姿势

画风华 发表于 2024-9-2 21:23:02

没看懂,是我太菜了,哎

ABitGinger 发表于 2024-9-2 21:23:21

Python玩法多多{:10_275:}

spt1314 发表于 2024-9-2 21:24:14

诸君还需努力,我躺平就好

lu10086 发表于 2024-9-2 21:24:28

好家伙

Ming-02 发表于 2024-9-2 21:25:56

学到了

Pioneer. 发表于 2024-9-2 21:27:00

学习学习

赵晨申 发表于 2024-9-2 21:28:31

继续学习,在编程的道路越走越远

生生不息的鲸落 发表于 2024-9-2 21:28:45

emmm有点看不懂

kyo890814 发表于 2024-9-2 21:32:30

哈哈不错
页: [1] 2 3
查看完整版本: 分享一个有趣的闭包玩法~