不弃_ 发表于 2022-2-23 15:45:33

__new__()方法的使用

怎么返回函数本事,好像递归。这个方法到底怎么用?
class C2F(float):
      "摄氏度转换为华氏度"
      def __new__(cls, arg=0.0):
                return float.__new__(cls, arg * 1.8 + 32)

isdkz 发表于 2022-2-23 15:45:34

不弃_ 发表于 2022-2-25 10:55
看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?

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

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

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

大马强 发表于 2022-2-23 15:57:07

这个方法是在你创建一个新的实例对象自动调用的,和init方法一样
小甲鱼也讲过new方法返回一个实例对象,但init无返回

Twilight6 发表于 2022-2-23 16:49:08



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

https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=199003&pid=5468101

isdkz 发表于 2022-2-23 19:17:18

本帖最后由 isdkz 于 2022-2-23 19:55 编辑

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

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

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

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

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

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

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

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

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

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

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

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

不弃_ 发表于 2022-2-24 20:29:43

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

而不需 ...

__new__方法本质上不是返回本身的内存地址吗,这和他返回一个实例对象有什么联系吗?

不弃_ 发表于 2022-2-24 20:52:20

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

而不需 ...

你这个 float(arg * 1.8 + 32) 实际经过了两步啥的,以我现在的水平还不能个理解

isdkz 发表于 2022-2-24 21:08:24

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

__new__实质上是新建了一个实例对象,返回实例对象的地址

不弃_ 发表于 2022-2-25 10:55:05

isdkz 发表于 2022-2-24 21:08
__new__实质上是新建了一个实例对象,返回实例对象的地址

看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?

一只魈咸鱼 发表于 2022-2-25 16:52:26

个人建议如果目前刚学到类可以先放过去,等后面你对“对象”越来越熟悉这些东西就自个明白了。真想现在研究研究的话可以看楼上几位大佬,但说实话这个方法几乎不怎么用。
页: [1]
查看完整版本: __new__()方法的使用