鱼C论坛

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

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

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

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

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

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

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

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


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

      
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    list1 =[]
    while i<num:
        a = A() 
        list1.append(a)
        i = i+1

    print(A.num)
    print(list1)


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

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


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

list1 =[]
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    while i<num:
        a = A() 
        list1.append(a)
        del a
        i = i+1

    print(A.num)
    print(list1)

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

使用道具 举报

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

你的那个 a 还在呢,改成这样:
class A:
    num = 0
   
    def __init__(self):
        A.num = A.num +1


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

i = 0
list1 =[]
while i<1:   
    a = A()
    list1.append(a)
    i = i+1

print(A.num)
print(list1)


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

使用道具 举报

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

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

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


i = 0
list1 = []
while i < 1:
    a = A()
    list1.append(a)
    i = i + 1

print(A.num)
print(list1)

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

使用道具 举报

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

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


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

      
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    list1 =[]
    while i<num:
        a = A() 
        list1.append(a)
        i = i+1

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

使用道具 举报

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

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


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

      
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    list1 =[]
    while i<num:
        a = A() 
        list1.append(a)
        i = i+1

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

使用道具 举报

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

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


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

i = 0
list1 =[]
while i<1:   
    a = A()
    list1.append(a)
    i = i+1

print(A.num)
print(list1)

del a,list1[0]
print(A.num)
print(list1)
再试试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

再试试吧

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


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

      
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    list1 =[]
    while i<num:
        a = A() 
        list1.append(a)
        i = i+1

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

使用道具 举报

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


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


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

i = 0
list1 =[]
while i<1:   
    a = A()
    list1.append(a)
    del a
    i = i+1

print(A.num)
print(list1)

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

使用道具 举报

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


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

list1 =[]
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    while i<num:
        a = A() 
        list1.append(a)
        del a
        i = i+1

    print(A.num)
    print(list1)

    num = int(input("要销毁多少个变量:"))
    if num > len(list1):
        print("没有这么多个变量,最多%d个" %(len(list1)))
        continue
    i = 0
    while i < num:
        del list1[0]
        i = i+1
     

    print(list1)
    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不就完了

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


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

list1 =[]
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    while i<num:
        a = A() 
        list1.append(a)
        del a
        i = i+1

    print(A.num)
    print(list1)

    num = int(input("要销毁多少个变量:"))
    if num > len(list1):
        print("没有这么多个变量,最多%d个" %(len(list1)))
        continue
    i = 0
    while i < num:
        del list1[0]
        i = i+1
     

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

使用道具 举报

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

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


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

list1 =[]
while True:
    num = int(input("要定义多少个变量:"))
    i = 0
    while i<num:
        a = A() 
        list1.append(a)
        del a
        i = i+1

    print(A.num)
    print(list1)

    num = int(input("要销毁多少个变量:"))
    if num > len(list1):
        print("没有这么多个变量,最多%d个" %(len(list1)))
        continue
    i = 0
    while i < num:
        del list1[0]
        i = i+1
    print(list1)
    print(A.num)
    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-11-26 01:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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