编辑:免责声明 - 我并不是指适用于非内存管理语言(例如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__ 中删除类?,该问题涵盖了删除发生在课堂之外的第一种情况
del DestructMe
Run Code Online (Sandbox Code Playgroud)
这不是删除类。这是删除恰好引用该类的名称。如果没有对该类的其他引用(包括您刚刚删除的名称、曾经导入该类的任何模块、该类的任何实例以及可能存储该类的任何其他位置),则垃圾当您 .收集器可能会删除该类gc.collect()。
现在,一个实例总是通过__class__属性知道它自己的类。删除 没有什么意义self.__class__,因为那样我们还剩下什么?没有类的实例?我们能用它做什么?我们不能调用它的方法,因为这些方法是在类上定义的,并且我们不能对它做任何事情,因为它不再是(我们刚刚删除的类的超类)object的实例。object所以我们实际上有一种看起来很傻的字典,它甚至不能完成dictPython 中的所有功能。因此,不被允许。
Python 中不能删除数据。这就是垃圾收集器的工作。没有与 Cfree或 C++相同的 Python 语言delete。del在 Python 中删除绑定或字典条目。它不会删除数据;它删除恰好指向数据的指针。
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |