鱼C论坛

 找回密码
 立即注册
查看: 594|回复: 5

[已解决]42课魔法方法--IDLE和Pycharm运行结果不一致

[复制链接]
发表于 2018-7-18 09:18:40 | 显示全部楼层 |阅读模式

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

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

x
IDLE(Python 3.7.0)
  1. >>> class C:
  2.     def __init__(self):
  3.         print("我是_init_方法,我被调用了....")
  4.     def __del__(self):
  5.         print("我是_del_方法,我被调用了....")

  6. >>> c=C()
  7. 我是_init_方法,我被调用了....
复制代码


Pycharm
  1. class C:
  2.     def __init__(self):
  3.         print("我是_init_方法,我被调用了....")
  4.     def __del__(self):
  5.         print("我是_del_方法,我被调用了....")
  6. c1=C()
复制代码

结果如图

Pycharm运行报错

Pycharm运行报错



这是怎么个情况啊


最佳答案
2018-7-18 09:51:49
本帖最后由 凌九霄 于 2018-7-18 10:01 编辑

跟交互环境不同,你在pycharm里面那样去执行的话,等于整个文件都执行完毕了,实例会被自动回收,所以__del__方法被调用。你的run提示里明确写着“进程已结束”。如果你在最下面加入一个input()函数,阻止整个文件被完全执行,就会发现跟idle里面一样的,直到你回车后,文件执行完毕,对象被释放,__del__被调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-18 09:51:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 2018-7-18 10:01 编辑

跟交互环境不同,你在pycharm里面那样去执行的话,等于整个文件都执行完毕了,实例会被自动回收,所以__del__方法被调用。你的run提示里明确写着“进程已结束”。如果你在最下面加入一个input()函数,阻止整个文件被完全执行,就会发现跟idle里面一样的,直到你回车后,文件执行完毕,对象被释放,__del__被调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-18 09:54:24 | 显示全部楼层
这与Pycharm无关,原因是Pycharm调用的是python.exe,在执行完毕后会删除所有的变量再退出,而idle不会删除继续保留它们。
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-18 09:57:35 | 显示全部楼层
这是因为在程序退出的时候,Python进行了垃圾回收,所以del魔法方法被调用了。

你在IDLE执行命令:
  1. del c
复制代码

你会发现魔法方法__del__被调用,这是因为,实例c没有被引用,所以就会被回收,进而调用del这个魔法方法

PS:因此这个跟编译器没有任何关系,你应该弄懂的是__del__这个魔法方法什么时候会被执行,而不要轻易怀疑编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-18 10:02:10 | 显示全部楼层
冬雪雪冬 发表于 2018-7-18 09:54
这与Pycharm无关,原因是Pycharm调用的是python.exe,在执行完毕后会删除所有的变量再退出,而idle不会删除 ...

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

使用道具 举报

 楼主| 发表于 2018-7-18 10:04:36 | 显示全部楼层
WylLy 发表于 2018-7-18 09:57
这是因为在程序退出的时候,Python进行了垃圾回收,所以del魔法方法被调用了。

你在IDLE执行命令:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 18:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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