Python 中的自删除类

Ray*_*out 3 python

编辑:免责声明 - 我并不是指适用于非内存管理语言(例如free在 C++ 中)的意义上的删除。这里的删除可以理解为超类被删除后,子类不再是其子类之一。

在Python中,您可以通过执行以下操作来删除a class(是的,我的意思是一个类,而不是一个实例):

class Super:
    ...
    
class DeleteMe(Super):
    ...

print(Super.__subclasses__())
# [<class '__main__.DeleteMe'>]

del DeleteMe
import gc
gc.collect() # Force a collection

print(Super.__subclasses__())
# []
Run Code Online (Sandbox Code Playgroud)

我正在尝试模仿这种行为,但我希望该类DeleteMe能够自我毁灭。这是我尝试过的:

class Super:
    ...
    
class DeleteMe(Super):
    def self_delete(self):
        print(self.__class__)
        # <class '__main__.DeleteMe'>, this looks right
        del self.__class__ # this fails
        import gc
        gc.collect()

print(Super.__subclasses__())
# [<class '__main__.DeleteMe'>]

DeleteMe().self_delete()
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下回溯:

Traceback (most recent call last):
  File "/Users/rayan/Desktop/test.py", line 10, in <module>
    DeleteMe().self_delete()
  File "/Users/rayan/Desktop/test.py", line 4, in self_delete
    del self.__class__
TypeError: can't delete __class__ attribute
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这种自毁行为?

注意:不是如何从 __subclasses__ 中删除类?,该问题涵盖了删除发生在课堂之外的第一种情况

Sil*_*olo 7

del DestructMe
Run Code Online (Sandbox Code Playgroud)

这不是删除类。这是删除恰好引用该类的名称。如果没有对该类的其他引用(包括您刚刚删除的名称、曾经导入该类的任何模块、该类的任何实例以及可能存储该类的任何其他位置),则垃圾当您 .收集器可能会删除该类gc.collect()

现在,一个实例总是通过__class__属性知道它自己的类。删除 没有什么意义self.__class__,因为那样我们还剩下什么?没有类的实例?我们能用它做什么?我们不能调用它的方法,因为这些方法是在类上定义的,并且我们不能对它做任何事情,因为它不再是(我们刚刚删除的类的超类)object的实例。object所以我们实际上有一种看起来很傻的字典,它甚至不能完成dictPython 中的所有功能。因此,不被允许。

Python 中不能删除数据。这就是垃圾收集器的工作。没有与 Cfree或 C++相同的 Python 语言deletedel在 Python 中删除绑定或字典条目。它不会删除数据;它删除恰好指向数据的指针。

  • “那么当你 gc.collect() 时,垃圾收集器可能会删除该类。” 因此,需要注意的是,“gc”仅控制*辅助*垃圾收集器。类经常涉及引用循环(对它们自己!),但如果引用计数达到 0,则无论 `gc` 在做什么,该对象都会**立即回收** (3认同)