鱼C论坛

 找回密码
 立即注册
查看: 820|回复: 14

[已解决]关于python中类__del__的疑惑

[复制链接]
发表于 2020-4-3 15:05:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 joelau 于 2020-4-7 11:46 编辑

在小甲鱼的[课后作业] 第039讲:类和对象:拾遗中的动动手第一题
我想使用列表来存储我新建的实例对象
再使用del方法进行删除

改成这样我就不会销毁了
求大家看看
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8.       
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     list1 =[]
  13.     while i<num:
  14.         a = A()
  15.         list1.append(a)
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)
复制代码



最佳答案
2020-4-7 11:22:53
joelau 发表于 2020-4-7 10:38
改成这样也行吧

这样你每次循环 删除后 列表不为空,那么会影响后面的。我改了一下,不会对下次循环有影响。如果可以你点个采纳吧。
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. list1 =[]
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     while i<num:
  13.         a = A()
  14.         list1.append(a)
  15.         del a
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)

  19.     num = int(input("要销毁多少个变量:"))
  20.     if num > len(list1):
  21.         print("没有这么多个变量,最多%d个" %(len(list1)))
  22.         continue
  23.     i = 0
  24.     while i < num:
  25.         del list1[0]
  26.         i = i+1
  27.     print(list1)
  28.     print(A.num)
  29.     list1.clear()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-3 16:45:09 | 显示全部楼层
本帖最后由 一个账号 于 2020-4-3 16:46 编辑

你的那个 a 还在呢,改成这样:

  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. i = 0
  9. list1 =[]
  10. while i<1:   
  11.     a = A()
  12.     list1.append(a)
  13.     i = i+1

  14. print(A.num)
  15. print(list1)


  16. del a
  17. del list1[0]
  18. print(A.num)
  19. print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 17:44:19 | 显示全部楼层
你没有删掉 a

  1. class A:
  2.     num = 0

  3.     def __init__(self):
  4.         A.num = A.num + 1

  5.     def __del__(self):
  6.         A.num = A.num - 1


  7. i = 0
  8. list1 = []
  9. while i < 1:
  10.     a = A()
  11.     list1.append(a)
  12.     i = i + 1

  13. print(A.num)
  14. print(list1)

  15. del list1[0]
  16. del a
  17. print(A.num)
  18. print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 10:08:39 | 显示全部楼层
一个账号 发表于 2020-4-3 16:45
你的那个 a 还在呢,改成这样:

如果改成这样下面还怎么销毁啊
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8.       
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     list1 =[]
  13.     while i<num:
  14.         a = A()
  15.         list1.append(a)
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 10:09:43 | 显示全部楼层

如果改成这样那怎么销毁啊
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8.       
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     list1 =[]
  13.     while i<num:
  14.         a = A()
  15.         list1.append(a)
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 10:18:42 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-7 10:21 编辑

触发析构函数必须 满足 没有任何名称指向该对象所在内存,很明显A还在呢?你改成这样
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. i = 0
  9. list1 =[]
  10. while i<1:   
  11.     a = A()
  12.     list1.append(a)
  13.     i = i+1

  14. print(A.num)
  15. print(list1)

  16. del a,list1[0]
  17. print(A.num)
  18. print(list1)
复制代码

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

使用道具 举报

 楼主| 发表于 2020-4-7 10:20:54 | 显示全部楼层
TJBEST 发表于 2020-4-7 10:18
触发析构函数必须 满足 没有任何名称指向该对象所在内存,很明显A还在呢?你改成这样

再试试吧

我现在想问这样怎么改
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8.       
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     list1 =[]
  13.     while i<num:
  14.         a = A()
  15.         list1.append(a)
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 10:22:34 | 显示全部楼层
joelau 发表于 2020-4-7 10:20
我现在想问这样怎么改


改成这样,如何,list加入后删掉a不就完了
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. i = 0
  9. list1 =[]
  10. while i<1:   
  11.     a = A()
  12.     list1.append(a)
  13.     del a
  14.     i = i+1

  15. print(A.num)
  16. print(list1)

  17. del list1[0]
  18. print(A.num)
  19. print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 10:35:46 | 显示全部楼层
行了我改完了改成这样子就没问题了谢谢上面的TJBEST给我的启示
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. list1 =[]
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     while i<num:
  13.         a = A()
  14.         list1.append(a)
  15.         del a
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)

  19.     num = int(input("要销毁多少个变量:"))
  20.     if num > len(list1):
  21.         print("没有这么多个变量,最多%d个" %(len(list1)))
  22.         continue
  23.     i = 0
  24.     while i < num:
  25.         del list1[0]
  26.         i = i+1
  27.      

  28.     print(list1)
  29.     print(A.num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 10:36:33 | 显示全部楼层
为什么不能我自己是最佳答案明明我自己帮自己解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 10:38:45 | 显示全部楼层
TJBEST 发表于 2020-4-7 10:22
改成这样,如何,list加入后删掉a不就完了

改成这样也行吧
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. list1 =[]
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     while i<num:
  13.         a = A()
  14.         list1.append(a)
  15.         del a
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)

  19.     num = int(input("要销毁多少个变量:"))
  20.     if num > len(list1):
  21.         print("没有这么多个变量,最多%d个" %(len(list1)))
  22.         continue
  23.     i = 0
  24.     while i < num:
  25.         del list1[0]
  26.         i = i+1
  27.      

  28.     print(list1)
  29.     print(A.num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 11:22:53 | 显示全部楼层    本楼为最佳答案   
joelau 发表于 2020-4-7 10:38
改成这样也行吧

这样你每次循环 删除后 列表不为空,那么会影响后面的。我改了一下,不会对下次循环有影响。如果可以你点个采纳吧。
  1. class A:
  2.     num = 0
  3.    
  4.     def __init__(self):
  5.         A.num = A.num +1


  6.     def __del__(self):
  7.         A.num = A.num - 1

  8. list1 =[]
  9. while True:
  10.     num = int(input("要定义多少个变量:"))
  11.     i = 0
  12.     while i<num:
  13.         a = A()
  14.         list1.append(a)
  15.         del a
  16.         i = i+1

  17.     print(A.num)
  18.     print(list1)

  19.     num = int(input("要销毁多少个变量:"))
  20.     if num > len(list1):
  21.         print("没有这么多个变量,最多%d个" %(len(list1)))
  22.         continue
  23.     i = 0
  24.     while i < num:
  25.         del list1[0]
  26.         i = i+1
  27.     print(list1)
  28.     print(A.num)
  29.     list1.clear()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 11:38:57 | 显示全部楼层
TJBEST 发表于 2020-4-7 11:22
这样你每次循环 删除后 列表不为空,那么会影响后面的。我改了一下,不会对下次循环有影响。如果可以你点 ...

我就是不想让它为空看看效果啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 11:39:28 | 显示全部楼层
TJBEST 发表于 2020-4-7 11:22
这样你每次循环 删除后 列表不为空,那么会影响后面的。我改了一下,不会对下次循环有影响。如果可以你点 ...

就算不为空效果也是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 11:43:32 | 显示全部楼层
joelau 发表于 2020-4-7 10:36
为什么不能我自己是最佳答案明明我自己帮自己解决了

你要选择对你帮助最大的,别人的答案为最佳答案,也好结贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 23:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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