鱼C论坛

 找回密码
 立即注册
查看: 2202|回复: 4

[已解决]求问大佬们,描述符__delete__方法怎么实现删除原类属性的功能啊?

[复制链接]
发表于 2020-12-10 14:40:37 | 显示全部楼层 |阅读模式

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

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

x
就是比如说我让A是一个描述符类,B是一个普通类。我在B中令  x = A()。则此x即为B类的一个属性,现在我想在外部使用   del B实例对象.x   操作删除B类的一个实例对象的x这个属性,也就是删除x这个A类的实例对象。求问在A类中的__delete__方法中该怎么编写代码??
最佳答案
2020-12-10 16:40:56
class Stu_descriptor:
    def __init__(self):
        pass
    def __get__(self, obj, objtype):
        print("获取了age的值")
        return self.age

    def __set__(self, obj, age):
        print("修改了age的值")
        self.age = age
    
    def __delete__(self, obj):
        print("删除了age属性")
        del self.age
        del Stu.age
    def __del__(self):
        print("删除了数据描述符实例")

class Stu:
    def __init__(self):
        pass
    age = Stu_descriptor()

print(Stu.__dict__)
stu1 = Stu()
stu2 = Stu()
stu2.age = 12
print(stu1.age)
del stu2.age
print(Stu.__dict__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-10 16:40:56 | 显示全部楼层    本楼为最佳答案   
class Stu_descriptor:
    def __init__(self):
        pass
    def __get__(self, obj, objtype):
        print("获取了age的值")
        return self.age

    def __set__(self, obj, age):
        print("修改了age的值")
        self.age = age
    
    def __delete__(self, obj):
        print("删除了age属性")
        del self.age
        del Stu.age
    def __del__(self):
        print("删除了数据描述符实例")

class Stu:
    def __init__(self):
        pass
    age = Stu_descriptor()

print(Stu.__dict__)
stu1 = Stu()
stu2 = Stu()
stu2.age = 12
print(stu1.age)
del stu2.age
print(Stu.__dict__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 20:14:42 | 显示全部楼层

大佬,14行和15行,为啥删除self.age不会调用描述符类的__del__(self)方法,而删除Stu.age时却调用描述符类的__del__方法啊??不应该是除self.age时程序会调用描述符类的与删除相关的魔法方法,而删除Stu.age时程序会调用Stu类的与删除相关的魔法方法吗??为啥是反的??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 20:52:31 | 显示全部楼层
__delete__和__del__完全不一样
__del__相当于自动垃圾回收 所有的类都有

再说你想直接触发__del__至少也得是del Stu.age  
del stu2.age明显不行  实例都没有age属性的



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

使用道具 举报

 楼主| 发表于 2020-12-10 21:45:59 | 显示全部楼层
kogawananari 发表于 2020-12-10 20:52
__delete__和__del__完全不一样
__del__相当于自动垃圾回收 所有的类都有

我傻了,这几节课一直和属性打交道,弄得我以为__del__方法时属性被删除时会调用的方法,回去看了笔记才想起来原来这方法是实例对象被删除时才调用的方法。。。描述符实例对象只能是类属性,不能是实例属性,这个我也搞明白了。感谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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