__new__
Posted 扫驴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__new__相关的知识,希望对你有一定的参考价值。
转载自https://www.cnblogs.com/MnCu8261/p/6365665.html
实际上,实例化类时调用的第一个方法并不是__init__,而是__new__,其作用正是创建并返回我们要创建的类的对象,然后才是执行__init__方法(如果类中有定义的话)
好了,接下来是重点:
1 当我们实例化A类对象时,Python中首先调用的是该A类对象的__new__方法,如果该A类对象没有定义__new__方法,则去父类中依次查找,直到object类
2 object类有一个__new__方法,该方法接收一个参数(一般为类对象),将该参数进行实例化并返回一个对象
3 Python解释器会将调用__new__方法并将A类对象作为第一个参数传入,最后会返回一个对象(这个对象就是A类的实例对象,我们称之为a1)
4 Python解释器默认会调用a1对象的__init__方法,并将参数传入。
来一个例子验证一下:
class asd(object): def __new__(cls, *args, **kwargs): print(\'asd.__new__() is running. cls id is %s\'%id(cls)) r = super(asd,cls).__new__(cls) print(\'r_id is %s\'%id(r)) return r class bnm(asd): def __init__(self,name): print(\'bnm.__init__() is running, self id is %s\'%id(self)) self.name = name print(\'bnm.name is %s\'%(self.name)) print(\'asd_id is %s\'%id(asd)) print(\'bnm_id is %s\'%id(bnm)) o1 = bnm(\'ni\') print(\'o1_id is\',id(o1)) # asd_id is 49838320 # bnm_id is 49838768 # asd.__new__() is running. cls id is 49838768 # r_id is 49848400 # bnm.__init__() is running, self id is 49848400 # bnm.name is ni # o1_id is 49848400 注意 : bnm 和 cls 是同一个对象! r 和 o1 也是同一个对象 !
以上是关于__new__的主要内容,如果未能解决你的问题,请参考以下文章
[AndroidStudio]_[初级]_[配置自动完成的代码片段]
[AndroidStudio]_[初级]_[配置自动完成的代码片段]