python - Python中的自删除类

标签 python

编辑:免责声明 - 我并不是指适用于非内存管理语言的删除(例如 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/

相关文章:

python - 在Python中从平面文件创建指纹文件

python - 如何仅在 pytesser 中启用数字?

python - 将 imshow 与共享 x 轴与 matplotlib 一起使用

python - 如何在 pydantic 模式验证后从蛇案例转变为 Camel 案例

java - 在 jython udp 数据包中发送原始十六进制数据

Python Regex ~ 简单的问题

python - 在 Tensorflow 中使用 3d 转置卷积进行上采样

python - Python中的工厂模式

python - 为什么 URLLib2 不支持持久连接?

python - 使用 Node.js AES CTR 加密并使用 PyCrypto 解密