鱼C论坛

 找回密码
 立即注册
查看: 895|回复: 11

[已解决]关于python的__new__() 和__del__()方法

[复制链接]
发表于 2020-3-30 20:37:09 | 显示全部楼层 |阅读模式

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

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

x
本人萌新 刚学面向对象的python想问一下就是 为什么既然__new__()可以传入参数 为何还需要init 方法来初始化实例对象呢 。 还有就是__del__方法的作用是什么啊 如果是回收对象 那么如果在类中重写了__del__()方法而又仅仅是输出一条语句的话 那么这个对象不就没有被回收吗。
最佳答案
2020-3-31 09:49:59
秃头小宝贝 发表于 2020-3-30 22:00
我好像理解错了  魔法方法不是事先就编写好的方法把?只是保留了这个方法 可以在特定条件下执行 如果要使 ...

有些魔法方法会从object继承,但大部分还是要你自己写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-30 20:41:21 | 显示全部楼层
1 new底层设计,但是给了高级的接口init,就像有c/c++可以实现一切,为什么要有python一样
2 有这种风险,导致内存泄漏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 21:13:36 | 显示全部楼层
BngThea 发表于 2020-3-30 20:41
1 new底层设计,但是给了高级的接口init,就像有c/c++可以实现一切,为什么要有python一样
2 有这种风险, ...

谢谢啦
还是有点不懂 就是理论上来说是可以 用new初始化对象的是吧 我就是看小甲鱼的视频上面 那个new方法的参数和init的参数是一样的 那我就像是不是可以直接用new初始化对象而不是用init

第二个问题就是 很多面向对象python讲解时讲__del__方法都会重写__del__ 输出一条语句来说明他调用的时间 但没有讲明白 他的最原始的作用是什么 所以我现在不太清楚  默认__del__的作用是什么了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 21:15:44 | 显示全部楼层
秃头小宝贝 发表于 2020-3-30 21:13
谢谢啦
还是有点不懂 就是理论上来说是可以 用new初始化对象的是吧 我就是看小甲鱼的视频上面 那个new ...

1 是可以,但是不建议,容易出错
2 就是用来释放内存的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 21:41:39 | 显示全部楼层
BngThea 发表于 2020-3-30 21:15
1 是可以,但是不建议,容易出错
2 就是用来释放内存的

噢噢噢谢谢! 头像是罗马帝国欸 懂了 就是如果像课程那样重写了 他就不能回收了 只能打印一行字了对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 22:00:12 | 显示全部楼层
BngThea 发表于 2020-3-30 21:15
1 是可以,但是不建议,容易出错
2 就是用来释放内存的

我好像理解错了  魔法方法不是事先就编写好的方法把?只是保留了这个方法 可以在特定条件下执行 如果要使用的话还是要自己编写的把?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 22:22:11 | 显示全部楼层
__new__(): 在类创建一个新实例是被调用。
__init__(): 是给实例的属性赋初值

__del__(): 在对象实例被回收之前会被调用,但如果你直接关闭运行环境,实例并没有被回收,该方法不会被执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 23:42:20 | 显示全部楼层
XiaoPaiShen 发表于 2020-3-30 22:22
__new__(): 在类创建一个新实例是被调用。
__init__(): 是给实例的属性赋初值

所以__del__()方法只是在 对象被回收之前执行 而不是通过调用__del__()方法来回收对象  是这样理解把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 01:43:54 | 显示全部楼层
秃头小宝贝 发表于 2020-3-30 23:42
所以__del__()方法只是在 对象被回收之前执行 而不是通过调用__del__()方法来回收对象  是这样理解把

是的,垃圾回收机制是系统控制的,你用 del 删除对象,回收机制会自动回收它的,会收前会执行 __del__() 方法。
如果你认为我的回答有帮助,请选择最佳答案,结贴。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 08:44:50 | 显示全部楼层
秃头小宝贝 发表于 2020-3-30 22:00
我好像理解错了  魔法方法不是事先就编写好的方法把?只是保留了这个方法 可以在特定条件下执行 如果要使 ...

默认编写的功能就已经实现了,自己有需求采取重写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 09:49:59 | 显示全部楼层    本楼为最佳答案   
秃头小宝贝 发表于 2020-3-30 22:00
我好像理解错了  魔法方法不是事先就编写好的方法把?只是保留了这个方法 可以在特定条件下执行 如果要使 ...

有些魔法方法会从object继承,但大部分还是要你自己写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 09:55:19 | 显示全部楼层
一般什么时候要用到 __new__ 呢,比如说你想要写一个分数类,如果分子与分母月份后分子为1就返回一个整数,__init__ 是肯定做不到的,这个时候就要用 __new__ 来返回一个整数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 17:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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