鱼C论坛

 找回密码
 立即注册
查看: 1318|回复: 12

[已解决]关于__del__()这个方法的问题

[复制链接]
发表于 2018-3-9 20:13:45 | 显示全部楼层 |阅读模式

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

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

x
class C:
        def __init__(self):
                print("__init__方法被调用")
        def __del__(self):
                print("__del__方法被调用")

>>>c1 = C()
__init__方法被调用
>>>c1 = C()
__init__方法被调用
__del__方法被调用

# 为什么第一次只输出一行   第二次输出两行
最佳答案
2018-3-9 21:31:49
嘻嘻咯咯 发表于 2018-3-9 21:18
我感觉我前面学得相当不好,还是没懂为啥第一次只执行__init__
为啥第一次只有创建没有删除啊?两个def ...

def定义的函数只有被调用时才执行。
第一次创建(实例化)c1,执行
>>> c1 = C()
__init__方法被调用
而当删除时才执行__del__
>>> del c1
__del__方法被调用
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-9 20:26:40 | 显示全部楼层
我的是两行啊,不过我的不是在IDLE上写的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-9 20:37:11 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-9 20:26
我的是两行啊,不过我的不是在IDLE上写的。

小甲鱼的课上讲的是一行 我自己敲代码的时候 多试了一次就变成两行了不知道为啥 我觉着应该就输出两行啊?好奇怪。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 20:45:35 | 显示全部楼层
我的理解,第一次实例化时只执行__init__,第二次实例化时先删除掉原来的c1再重新实例化,从地址看两次实例化的地址不同。
  1. >>> c1 = C()
  2. __init__方法被调用
  3. >>> id(c1)
  4. 2279985203576
  5. >>> c1 = C()
  6. __init__方法被调用
  7. __del__方法被调用
  8. >>> id(c1)
  9. 2279984721760
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-9 20:53:28 | 显示全部楼层
冬雪雪冬 发表于 2018-3-9 20:45
我的理解,第一次实例化时只执行__init__,第二次实例化时先删除掉原来的c1再重新实例化,从地址看两次实例 ...

第一次执行的时候为什么只执行__init__呢?  __init__和__del__是在一列的 应该顺着执行下去啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 20:55:27 | 显示全部楼层
嘻嘻咯咯 发表于 2018-3-9 20:53
第一次执行的时候为什么只执行__init__呢?  __init__和__del__是在一列的 应该顺着执行下去啊

第一次只有创建,没有删除呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-9 21:18:59 | 显示全部楼层
冬雪雪冬 发表于 2018-3-9 20:55
第一次只有创建,没有删除呀

我感觉我前面学得相当不好,还是没懂为啥第一次只执行__init__
为啥第一次只有创建没有删除啊?两个def在一个运行等级上不是应该都执行吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 21:31:49 | 显示全部楼层    本楼为最佳答案   
嘻嘻咯咯 发表于 2018-3-9 21:18
我感觉我前面学得相当不好,还是没懂为啥第一次只执行__init__
为啥第一次只有创建没有删除啊?两个def ...

def定义的函数只有被调用时才执行。
第一次创建(实例化)c1,执行
>>> c1 = C()
__init__方法被调用
而当删除时才执行__del__
>>> del c1
__del__方法被调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-9 21:58:07 | 显示全部楼层
冬雪雪冬 发表于 2018-3-9 21:31
def定义的函数只有被调用时才执行。
第一次创建(实例化)c1,执行
>>> c1 = C()

第一次创建c1执行>__init__方法被调用
第二次c1执行为啥会两个都输出呢
>__init__方法都被调用
  __del__方法都被调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 22:03:01 | 显示全部楼层
嘻嘻咯咯 发表于 2018-3-9 21:58
第一次创建c1执行>__init__方法被调用
第二次c1执行为啥会两个都输出呢
>__init__方法都被调 ...

我的理解,第一次创建一个c1,在重新创建时要先删除原来创建的c1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-9 22:08:49 | 显示全部楼层
冬雪雪冬 发表于 2018-3-9 22:03
我的理解,第一次创建一个c1,在重新创建时要先删除原来创建的c1

我的智商大概不太够,第二次创建时先删除原来创建的c1,为啥不是输出
__del__方法调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 22:12:32 | 显示全部楼层
嘻嘻咯咯 发表于 2018-3-9 22:08
我的智商大概不太够,第二次创建时先删除原来创建的c1,为啥不是输出
__del__方法调用

我也以为应该先__del__,再__init__,但为什么是这样的次序,就不得而知了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-10 00:35:49 | 显示全部楼层
冬雪雪冬 发表于 2018-3-9 22:12
我也以为应该先__del__,再__init__,但为什么是这样的次序,就不得而知了。

好吧既然这样我就先洗洗睡了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-8 10:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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