簡體   English   中英

從 python 中的 class function 中刪除 object 實例

[英]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

所有三個名稱xyz均指同一個列表 object。 現在刪除x

>>> del x
>>> x
NameError: name 'x' is not defined

yz在此之后引發NameError是沒有意義的。 想象一下,如果yz是不同 function 或模塊中的引用。 del x使其他引用消失會導致一些非常意外和不受歡迎的行為。

所以在正常情況下,你不能完全做你想做的事。 您當前的方法只是在方法本身的本地命名空間中刪除名稱self 它不能輕易修改全局命名空間。

話雖如此,您可以編寫一個 function 從全局命名空間中刪除一個名稱。 例如:

class MyClass:
    def myFunc(self, name):
        del globals()[name]

myInst = MyClass()
myInst.myFunc('myInst')

現在,如果您嘗試訪問myInst ,該名稱將在腳本中消失。 這是一個壞主意,而且可能根本不會刪除 object。 如果您對myInst有另一個引用,例如在listdict或直接分配給另一個名稱中,則該引用將持續存在,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM