码迷,mamicode.com
首页 > 其他好文 > 详细

__new__[转载]

时间:2018-05-02 19:09:26      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:elf   asd   turn   注意   ini   div   正是   创建   http   

转载自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__[转载]

标签:elf   asd   turn   注意   ini   div   正是   创建   http   

原文地址:https://www.cnblogs.com/saolv/p/8981726.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!