为什么我不能删除python中的类实例

时间:2015-07-15 10:55:52

标签: python oop

我想在python中删除一个类实例或使其为None。但是我无法做到。一般来说,我的代码执行如下操作: -

class Foo:
  pass

f = Foo()
g = Foo()
f.attr = g
h = f.attr
del h
print f.attr  # This is not None but it should be right?

更具体地说,在python中实现二叉搜索树时出现了这个问题。我的删除功能是这样的: -

class Tree:
  def delete(self, key):
    min_right = self.right.getmin()
    self.key = min_right.key
    del min_right  # Does not work

我做错了什么或是预期的行为?如果是预期的,OOP标准的最佳方法是什么才能实现我的目标?

2 个答案:

答案 0 :(得分:3)

您的情况如下:

                  g

                  |

     <__main__.Foo object at 0x...>

          /               \

       f.attr               h

即。三个引用相同的底层对象del h所做的只是删除名称h ,如下所示:

                  g

                  |

     <__main__.Foo object at 0x...>

          /               

       f.attr          

基础对象没有变化,而另外两个名称仍然提供对它的引用,您所做的就是删除对Foo实例的一个引用。 h现在是NameError,但gf.attr可以正常使用。

 # This is not None but it should be right?

我不知道为什么你会得出结论 - 如果你 成功地打破了从f.attrFoo实例的引用,你会得到一个AttributeError,而非None

推荐读取Python名称:http://nedbatchelder.com/text/names.html

答案 1 :(得分:1)

删除属性:

del f.attr

它会消失而不是None

将其设为None

f.attr = None

不要使用中间变量!