[英]Delete object instance from class function in python
我想在執行 function 之后刪除我的 object 的一個實例,這樣 python 腳本就不能再訪問這個實例了。
這是我的代碼:
class MyClass():
def myFunc(self):
...
del self
myClass = MyClass()
myClass.myFunc()
print(myClass) # Supposed to raise an error because myClass is supposed to be deleted but that's not the case
怎么了?
您誤解了del
的工作原理。 它不會刪除對象。 它刪除名稱。
例如,假設你有
>>> x = [1, 2, 3]
>>> y = x
>>> z = x
所有三個名稱x
、 y
、 z
均指同一個列表 object。 現在刪除x
:
>>> del x
>>> x
NameError: name 'x' is not defined
y
和z
在此之后引發NameError
是沒有意義的。 想象一下,如果y
和z
是不同 function 或模塊中的引用。 讓del x
使其他引用消失會導致一些非常意外和不受歡迎的行為。
所以在正常情況下,你不能完全做你想做的事。 您當前的方法只是在方法本身的本地命名空間中刪除名稱self
。 它不能輕易修改全局命名空間。
話雖如此,您可以編寫一個 function 從全局命名空間中刪除一個名稱。 例如:
class MyClass:
def myFunc(self, name):
del globals()[name]
myInst = MyClass()
myInst.myFunc('myInst')
現在,如果您嘗試訪問myInst
,該名稱將在腳本中消失。 這是一個壞主意,而且可能根本不會刪除 object。 如果您對myInst
有另一個引用,例如在list
、 dict
或直接分配給另一個名稱中,則該引用將持續存在,object 本身也將持續存在。
正如評論中所建議的,一種更好的方法是將實例標記為不可用。 例如,您可以執行類似的操作
class MyClass:
def __init__(self):
self.useable = True
def my_func(self):
self._check_useable()
# do your thing...
self.useable = False
def other_func(self, *args):
self._check_useable()
# Do stuff to args ...
def _check_useable(self):
if not self.useable:
raise ValueError('Class is not useable!')
有更強大的方法來實現標志以使其對臨時用戶不那么容易訪問,但它們基本上遵循相同的模式。
由於不能刪除 python 中的對象,只能刪除命名空間中變量的外觀。 我建議只在調用一次 function 后引發錯誤。 因為您希望在運行后發生錯誤。
class MyClass():
def myFunc(self):
...
counter += 1
del self
counter = 0
# Check if the function has been run once and then raise exception
if counter > 0:
raise exception("Instance cannot be used")
myClass = MyClass()
myClass.myFunc()
print(myClass)
我希望這仍然符合您的預期,但del
function 只會刪除命名空間中變量的外觀,並且不允許您再引用它(但它不會被刪除)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.