__new__()方法的使用
怎么返回函数本事,好像递归。这个方法到底怎么用?class C2F(float):
"摄氏度转换为华氏度"
def __new__(cls, arg=0.0):
return float.__new__(cls, arg * 1.8 + 32)
不弃_ 发表于 2022-2-25 10:55
看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊?
他的意思大概是 __new__ 是方法的内存地址,
在编程语言中,名称都关联着一个内存地址的,
__new__() 调用后的返回值是返回一个实例化对象,也即实例对象的地址 这个方法是在你创建一个新的实例对象自动调用的,和init方法一样
小甲鱼也讲过new方法返回一个实例对象,但init无返回
类似问题,可以参考本帖子:
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=199003&pid=5468101
本帖最后由 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就不由你自己控制了
'''
isdkz 发表于 2022-2-23 19:17
魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),
而不需 ...
__new__方法本质上不是返回本身的内存地址吗,这和他返回一个实例对象有什么联系吗? isdkz 发表于 2022-2-23 19:17
魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),
而不需 ...
你这个 float(arg * 1.8 + 32) 实际经过了两步啥的,以我现在的水平还不能个理解 不弃_ 发表于 2022-2-24 20:29
__new__方法本质上不是返回本身的内存地址吗,这和他返回一个实例对象有什么联系吗?
__new__实质上是新建了一个实例对象,返回实例对象的地址 isdkz 发表于 2022-2-24 21:08
__new__实质上是新建了一个实例对象,返回实例对象的地址
看三楼帖子说返回的是方法的内存地址,到底是方法还是对象的内存地址啊? 个人建议如果目前刚学到类可以先放过去,等后面你对“对象”越来越熟悉这些东西就自个明白了。真想现在研究研究的话可以看楼上几位大佬,但说实话这个方法几乎不怎么用。
页:
[1]