bio911 发表于 2023-8-10 13:47:56

Python第2版(第162页)例子代码问题请教

本帖最后由 bio911 于 2023-8-10 14:19 编辑

书上162页12.1.3 __del__(self)例子的代码
>>>class C:
       def __init__(self):
            print("我是__init__方法,我被调用了...")
       def __del__(self):
            print("我是__del__方法,我被调用了...")

>>>c1 = C ( )
我是__init__方法,我被调用了...
>>>c2 = c1
>>>c3 = c2
>>>del c1
>>>del c2
>>>del c3
我是__del__方法,我被调用了...

复制到PyCharm Community Edition运行(复制代码如下)
class C:
    def __init__(self):
      print("我是__init__方法,我被调用了......")
    def __del__(self):
      print("我是__del__方法,我被调用了.......")

c1 = C()

结果运行直接就是:
我是__init__方法,我被调用了......
我是__del__方法,我被调用了.......

我的问题是书上代码到“c1 = C ( )”这一步时,结果是“我是__init__方法,我被调用了...”
为什么我用PyCharm Community Edition到“c1 = C( )”这一步时,结果是“我是__init__方法,我被调用了......我是__del__方法,我被调用了.......”

陶远航 发表于 2023-8-10 13:48:11

根据您提供的代码,我可以看出您在PyCharm Community Edition中运行了一个类实例化的例子。如果运行结果只显示一次 __init__ 方法和一次 __del__ 方法,这是符合预期的。

让我来解释一下这个例子的执行流程:

1. 创建了一个类 C,并定义了 __init__ 和 __del__ 两个方法。
2. 实例化了一个对象 c1,此时会调用 __init__ 方法,并输出 "我是__init__方法,我被调用了..."。
3. 执行到 del c1 时,它会触发对象 c1 的销毁操作,即调用 __del__ 方法,并输出 "我是__del__方法,我被调用了..."。

这里需要注意的是,在 PyCharm Community Edition 中运行代码时,它会自动退出运行,这就导致你可能无法看到完整的输出结果。你可以在代码的最后添加一个 input() 语句,以便程序暂停等待用户输入,从而看到完整的输出结果。

修正后的代码如下:

class C:
    def __init__(self):
      print("我是__init__方法,我被调用了......")
   
    def __del__(self):
      print("我是__del__方法,我被调用了.......")

c1 = C()
input("按任意键继续...")


这样,当你运行这段代码时,它将显示完整的输出结果,并等待用户按下任意键继续执行。希望这可以帮到你!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

歌者文明清理员 发表于 2023-8-10 14:00:39

很正常,因为 pycharm 中程序运行完会退出,变量也被销毁,而 Shell 中你退出时你看不见输出
另外只显示一次的原因是,c1、c2、c3都指向同一个内容,c1、c2没了还有c3

bio911 发表于 2023-8-10 14:34:30

陶远航 发表于 2023-8-10 13:48
根据您提供的代码,我可以看出您在PyCharm Community Edition中运行了一个类实例化的例子。如果运行结果只 ...

大神再请教下:
书上代码到“c1 = C ( )”这一步时,结果是“我是__init__方法,我被调用了...”
为什么我用PyCharm Community Edition到“c1 = C( )”这一步时,结果是“我是__init__方法,我被调用了......我是__del__方法,我被调用了.......”

陶远航 发表于 2023-8-10 15:33:19

bio911 发表于 2023-8-10 14:34
大神再请教下:
书上代码到“c1 = C ( )”这一步时,结果是“我是__init__方法,我被调用了...”
为什 ...

根据您提供的信息,书上的代码与您在 PyCharm Community Edition 中运行的代码应该是等效的。在理论上,它们应该产生相同的输出结果。可能出现不同结果的原因可能与您的环境设置或代码的其它部分有关。

一种可能性是,PyCharm Community Edition 在运行代码时可能会以不同的方式处理对象的销毁。如果您在 PyCharm 中看到了 "del" 方法被调用,这意味着某些情况下对象可能被更早地销毁。这可能是由于 Python 解释器和 PyCharm 之间的微妙差异导致的。

如果您希望确保代码的输出一致性,您可以尝试在 PyCharm 中运行以下代码,看看是否会得到和书上相同的结果:

class C:
    def __init__(self):
      print("我是__init__方法,我被调用了......")
   
    def __del__(self):
      print("我是__del__方法,我被调用了.......")

c1 = C()
如果在 PyCharm 中运行此代码,确保您没有添加任何额外的配置或代码,您应该会得到与书上相同的输出结果。

请注意,Python 的对象销毁和垃圾回收机制在不同的环境中可能会有微妙的差异,这些差异可能导致输出不同。但从理论上讲,根据您提供的代码,初始化(init)方法应该在创建对象时被调用,而销毁(del)方法应该在对象被删除时被调用。

bio911 发表于 2023-8-10 15:46:34

陶远航 发表于 2023-8-10 15:33
根据您提供的信息,书上的代码与您在 PyCharm Community Edition 中运行的代码应该是等效的。在理论上, ...

额,复制运行了,还是直接显示:

我是__init__方法,我被调用了......
我是__del__方法,我被调用了.......

进程已结束,退出代码0

陶远航 发表于 2023-8-10 15:52:43

bio911 发表于 2023-8-10 15:46
额,复制运行了,还是直接显示:

我是__init__方法,我被调用了......


重启python shell,再运行

bio911 发表于 2023-8-10 16:02:42

陶远航 发表于 2023-8-10 15:52
重启python shell,再运行

额,我用的是PyCharm Community Edition ,运行结果跟python shell不同,所以才有以上问题。

陶远航 发表于 2023-8-10 16:09:06

bio911 发表于 2023-8-10 16:02
额,我用的是PyCharm Community Edition ,运行结果跟python shell不同,所以才有以上问题。

你可以点击右边那个垃圾桶,清除这个环境,再运行一次可能就行了

bio911 发表于 2023-8-10 16:33:45

歌者文明清理员 发表于 2023-8-10 14:00
很正常,因为 pycharm 中程序运行完会退出,变量也被销毁,而 Shell 中你退出时你看不见输出
另外只显示一 ...

感谢大佬答疑,我还是没理解到.....
看了各位大拿的回答,我大概理解是PyCharm Community Edition和Python shell运行的环境不同,导致书本案例用Python shell执行“c1 = C( )”是一步一个结果:
我是__init__方法,我被调用了...

而PyCharm Community Edition执行“c1 = C( )”是直接两个结果:
我是__init__方法,我被调用了......
我是__del__方法,我被调用了......

歌者文明清理员 发表于 2023-8-10 18:37:51

bio911 发表于 2023-8-10 16:33
感谢大佬答疑,我还是没理解到.....
看了各位大拿的回答,我大概理解是PyCharm Community Edition和Pyth ...

不是环境问题,Python程序运行完了变量不就找不到了吗,__del__()就会调用

bio911 发表于 2023-8-11 10:24:36

歌者文明清理员 发表于 2023-8-10 18:37
不是环境问题,Python程序运行完了变量不就找不到了吗,__del__()就会调用

那为什么Python shell执行“c1 = C( )“,执行结果是“我是__init__方法,我被调用了......”?而PyCharm Community Edition执行“c1 = C( )”,执行结果是“我是__init__方法,我被调用了......    我是__del__方法,我被调用了......”?

歌者文明清理员 发表于 2023-8-11 10:25:36

bio911 发表于 2023-8-11 10:24
那为什么Python shell执行“c1 = C( )“,执行结果是“我是__init__方法,我被调用了......”?而PyCharm...

PyCharm 退出程序 -> 变量被销毁 -> __del__() 被调用
Shell 退出后的输出结果你看不见,PyCharm可以看见

bio911 发表于 2023-8-11 10:43:50

歌者文明清理员 发表于 2023-8-11 10:25
PyCharm 退出程序 -> 变量被销毁 -> __del__() 被调用
Shell 退出后的输出结果你看不见,PyCharm可以看 ...

好的,谢谢大神解答,我还需要再消化消化。

歌者文明清理员 发表于 2023-8-11 10:54:07

bio911 发表于 2023-8-11 10:43
好的,谢谢大神解答,我还需要再消化消化。

备注:我的回答中->是导致的意思
页: [1]
查看完整版本: Python第2版(第162页)例子代码问题请教