编辑:免责声明 - 我并不是指适用于非内存管理语言的删除(例如 C++ 中的 free
)。这里的删除应该理解为父类在被删除后不再有子类作为其子类之一。
在 Python 中,您可以通过执行以下操作来删除 class
(是的,我 do 是指类,而不是实例):
class Super:
...
class DeleteMe(Super):
...
print(Super.__subclasses__())
# [<class '__main__.DeleteMe'>]
del DeleteMe
import gc
gc.collect() # Force a collection
print(Super.__subclasses__())
# []
我正在尝试模拟这种行为,但我希望 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()
失败并返回以下回溯:
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
如何实现这种自毁行为?
注意:不是 How to remove classes from __subclasses__? 的副本,该问题涵盖了删除发生在类之外的第一种情况
最佳答案
del DestructMe
这不是删除类(class)。这是删除碰巧引用该类的名称。如果没有其他对该类的引用(包括您刚刚删除的名称、曾经导入该类的任何模块、该类的任何 instances 以及该类可能发生的任何其他位置被存储),然后垃圾收集器可能在你 gc.collect()
时删除该类。
现在一个实例总是通过 __class__
属性知道它自己的类。删除 self.__class__
没有什么意义,因为那样我们会剩下什么?没有类的实例?我们能用它做什么?我们不能在它上面调用方法,因为它们是在类上定义的,而且我们不能对它做任何 object
之类的事情,因为它不再是 object
的实例(我们刚刚删除的类的父类(super class))。所以实际上我们有一种看起来很傻的字典,它甚至不做 Python 中所有的 dict
事情。因此,不允许。
您不能在 Python 中删除数据。那是垃圾收集器的工作。没有与 C 的 free
或 C++ 的 delete
等效的 Python。 Python 中的 del
删除绑定(bind)或字典条目。它不会删除数据;它会删除碰巧指向数据的指针。
关于python - Python中的自删除类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71711301/