久远的心宿三 发表于 2020-12-10 14:40:37

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

就是比如说我让A是一个描述符类,B是一个普通类。我在B中令x = A()。则此x即为B类的一个属性,现在我想在外部使用   del B实例对象.x   操作删除B类的一个实例对象的x这个属性,也就是删除x这个A类的实例对象。求问在A类中的__delete__方法中该怎么编写代码??

kogawananari 发表于 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__)

久远的心宿三 发表于 2020-12-10 20:14:42

kogawananari 发表于 2020-12-10 16:40


大佬,14行和15行,为啥删除self.age不会调用描述符类的__del__(self)方法,而删除Stu.age时却调用描述符类的__del__方法啊??不应该是除self.age时程序会调用描述符类的与删除相关的魔法方法,而删除Stu.age时程序会调用Stu类的与删除相关的魔法方法吗??为啥是反的??

kogawananari 发表于 2020-12-10 20:52:31

__delete__和__del__完全不一样
__del__相当于自动垃圾回收 所有的类都有

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


久远的心宿三 发表于 2020-12-10 21:45:59

kogawananari 发表于 2020-12-10 20:52
__delete__和__del__完全不一样
__del__相当于自动垃圾回收 所有的类都有



我傻了,这几节课一直和属性打交道,弄得我以为__del__方法时属性被删除时会调用的方法,回去看了笔记才想起来原来这方法是实例对象被删除时才调用的方法。。。描述符实例对象只能是类属性,不能是实例属性,这个我也搞明白了。感谢大佬!
页: [1]
查看完整版本: 求问大佬们,描述符__delete__方法怎么实现删除原类属性的功能啊?