鱼C论坛

 找回密码
 立即注册
查看: 129|回复: 2

del方法是在对象销毁前的拦截来实现对象的重生

[复制链接]
发表于 2024-9-8 22:34:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大侠:

       小甲鱼老师在<66.原来Python懂魔法 -- 类和对象(VIII)>中讲解"del方法是在对象销毁前的最后拦截,那么有没有一种可能性,我们可以利用这个来实现对象的重生?",我按照视频内容输入了代码,但结果报错,显示x未被定义.

      我的代码检测了几次,应该跟小甲鱼视频里的一样啊,但为啥会报错???

      烦请大侠指点一二,谢谢!

       Screenshot.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-8 22:34:28 | 显示全部楼层
你好,鱼油!

你提到的 `__del__` 方法确实是在对象即将被销毁时调用的,但它无法直接实现对象的“重生”。原因是,当 `__del__` 被调用时,Python 的垃圾回收机制已经决定要销毁这个对象。因此,你无法在 `__del__` 里重新赋值给同一个变量。

我们可以通过其他方式来模拟对象的“重生”效果。例如,可以在 `__del__` 方法中创建一个新的实例并赋值给某个全局变量。以下是一个示例代码:
class MyClass:
    def __init__(self, name):
        self.name = name
        print(f"{self.name} 已经创建")

    def __del__(self):
        global singleton
        print(f"{self.name} 即将被销毁")
        if singleton is None:
            print("创建新的 MyClass 实例")
            singleton = MyClass(self.name)
        
# 初始化全局变量singleton
singleton = None

# 创建第一个实例
singleton = MyClass("对象1")

# 删除它,触发__del__方法
del singleton

# 查看singleton是否被“重生”
print(singleton.name)

在这个示例中,当 `singleton` 被删除时, `__del__` 方法会被调用。在 `__del__` 方法中,我们检查全局变量 `singleton` 是否为 `None`,如果是,则创建一个新的 `MyClass` 实例并赋值给 `singleton`。

请注意,这种实现方式只是模拟了对象“重生”的行为,实际项目中需要根据具体需求来选择合适的方法。

希望这个解释对你有帮助!如果你还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-9 00:03:51 | 显示全部楼层
初学者还是不要用jupyter notebook吧,你不用jupyter notebook就可以成功了,

我可以简单说一下原因,__del__ 是在对象的引用计数为 0,即对象在被回收的时候才会执行,

并不是说使用 del 语句就会执行 __del__ 方法,del d 只是使 d 的引用计数减 1 而已


下面用两张图说明一下:

Snipaste_2024-09-08_23-54-12.png


Snipaste_2024-09-09_00-02-38.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表