鱼C论坛

 找回密码
 立即注册
查看: 881|回复: 9

[已解决]__new__()方法的使用

[复制链接]
发表于 2022-2-23 15:45:33 | 显示全部楼层 |阅读模式
5鱼币
怎么返回函数本事,好像递归。这个方法到底怎么用?
  1. class C2F(float):
  2.         "摄氏度转换为华氏度"
  3.         def __new__(cls, arg=0.0):
  4.                 return float.__new__(cls, arg * 1.8 + 32)
复制代码
最佳答案
2022-2-23 15:45:34
不弃_ 发表于 2022-2-25 10:55
看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?

他的意思大概是 __new__ 是方法的内存地址,

在编程语言中,名称都关联着一个内存地址的,

__new__() 调用后的返回值是返回一个实例化对象,也即实例对象的地址

最佳答案

查看完整内容

他的意思大概是 __new__ 是方法的内存地址, 在编程语言中,名称都关联着一个内存地址的, __new__() 调用后的返回值是返回一个实例化对象,也即实例对象的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-23 15:45:34 | 显示全部楼层    本楼为最佳答案   
不弃_ 发表于 2022-2-25 10:55
看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?

他的意思大概是 __new__ 是方法的内存地址,

在编程语言中,名称都关联着一个内存地址的,

__new__() 调用后的返回值是返回一个实例化对象,也即实例对象的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-23 15:57:07 | 显示全部楼层
这个方法是在你创建一个新的实例对象自动调用的,和init方法一样
小甲鱼也讲过new方法返回一个实例对象,但init无返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-23 16:49:08 | 显示全部楼层


类似问题,可以参考本帖子:

https://fishc.com.cn/forum.php?m ... 003&pid=5468101

评分

参与人数 1鱼币 +1 收起 理由
不弃_ + 1 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2022-2-23 19:17:18 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-23 19:55 编辑

魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),

而不需要你手动去调用,当然,手动调用也是没问题的,

只不过解释器自动调用也会帮你自动传入一些参数(self,cls),而手动调用需要你自己传入


类在实例化的过程会自动去调用魔法方法 __new__,这个方法会返回一个实例化后的对象,
实例完成后解释器再去调用 __new__ 返回的对象的 __init__ 方法来进行初始化,

这里先提一下工厂函数,跟魔法方法的内容无关
工厂函数,即一个会返回新的对象的函数,实际上工厂函数是一个类,比如 float

调用 __new__ 方法实际上就是实例化,只不过手动调用 __new__ 方法的,只会进行实例化,不会进行初始化,
而由解释器去自动调用的,它在调用完 __new__ 方法后会自动帮你调用 __init__ 方法初始化

  1. class C2F(float):
  2.         "摄氏度转换为华氏度"
  3.         def __new__(cls, arg=0.0):
  4.                 return float.__new__(cls, arg * 1.8 + 32)   
  5. '''
  6. 这里实际上你用float(arg * 1.8 + 32) 会得到一样的结果,但是它们并不对等,

  7. 因为 float(arg * 1.8 + 32) 实际经过了两步,

  8. 第一步,temp = float.__new__(float, arg * 1.8 + 32)  (这里为了说明,用了一个临时变量),

  9. 第二步,temp.__init__(temp, arg * 1.8 + 32),

  10. 而且使用 float(arg * 1.8 + 32)  由解释器去自动调用 __new__ 和 __init__ 的时候,

  11. 解释器会在这中间过程会自己传入cls,self,所以其中的cls,self就不由你自己控制了
  12. '''
复制代码

评分

参与人数 1鱼币 +1 收起 理由
不弃_ + 1 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-2-24 20:29:43 | 显示全部楼层
isdkz 发表于 2022-2-23 19:17
魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),

而不需 ...

__new__方法本质上不是返回本身的内存地址吗,这和他返回一个实例对象有什么联系吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-24 20:52:20 | 显示全部楼层
isdkz 发表于 2022-2-23 19:17
魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),

而不需 ...

你这个 float(arg * 1.8 + 32) 实际经过了两步啥的,以我现在的水平还不能个理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-24 21:08:24 | 显示全部楼层
不弃_ 发表于 2022-2-24 20:29
__new__方法本质上不是返回本身的内存地址吗,这和他返回一个实例对象有什么联系吗?

__new__实质上是新建了一个实例对象,返回实例对象的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-25 10:55:05 From FishC Mobile | 显示全部楼层
isdkz 发表于 2022-2-24 21:08
__new__实质上是新建了一个实例对象,返回实例对象的地址

看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-25 16:52:26 | 显示全部楼层
个人建议如果目前刚学到类可以先放过去,等后面你对“对象”越来越熟悉这些东西就自个明白了。真想现在研究研究的话可以看楼上几位大佬,但说实话这个方法几乎不怎么用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 17:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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