2015-07-20 103 views
2

我必須定義一個類方法,它刪除該類的實例。
Python - UnboundLocalError:賦值之前引用的局部變量'obj'

class baseClass(object): 

    def __init__(self): 
     pass 

    def fun(self): 
     print 'Base Class' 


class derivedClass(baseClass): 

    def __init__(self): 
     super(derivedClass, self).__init__() 

    def fun(self): 
     print 'Derived class' 

    def exitfun(self): 
     print 'Delete Object Instance' 
     del obj 

obj = derivedClass() 
obj.fun() 
obj.exitfun() 

,我發現了以下錯誤:代碼的骨架爲如下

Traceback (most recent call last): 
File "C:\Python27\inheritance_del_instance.py", line 23, in <module> 
obj.exitfun() 
File "C:\Python27\inheritance_del_instance.py", line 19, in exitfun 
del obj 
UnboundLocalError: local variable 'obj' referenced before assignment 

比調用其他,

del <object> 
在主

,是否有備用方法通過其成員函數來刪除類的實例。 在此先感謝!

+0

,我不認爲你想要做什麼是可能的,除了也許去除對應條目'globals'字典中的'self'。但即使如此,對該對象的引用也可能更多,例如在列表或其他字典中。無論如何,你需要什麼? –

+0

'del obj'不起作用,因爲你沒有給'obj'賦值,所以不能直觀地說你正在談論對象本身。 – SuperBiasedMan

+1

@AnandSKumar不完全正確。 CPython使用引用計數;所以一旦引用計數達到0,對象將被刪除。只有在循環引用的情況下,垃圾收集器纔會啓動,並且執行該操作確實是不確定的。 –

回答

3

Python有一個垃圾回收器,所以當沒有更多的引用指向它時,就從內存中刪除一個對象。 關鍵字del只是刪除變量名稱和對象之間的綁定(引用)。如果沒有更多的對象引用,它的內存將被垃圾收集器釋放。 使用del刪除對象內部的對象是沒有意義的,因爲del本身不會觸發任何刪除。

此外在你的代碼中你有一個語法錯誤,實際上變量obj沒有定義。您應該使用self從其中引用對象本身。

1

使用關鍵字global將解決您的問題:

def exitfun(self): 
    global obj 
    del obj 

然而,這可能不是你想要做什麼。爲了定義類方法,您需要裝飾器classmethod。此外,您可以在類級別保存實例,所以你不必通過globals訪問它:

class Test(object): 

    def __init__(self): 
     type(self).instance = self 

    def say_hello(self): 
     print 'Hello!' 

    @classmethod 
    def remove_instance(cls): 
     del cls.instance 

Test() 
Test.instance.say_hello() 
Test.remove_instance() 
相關問題