zoukankan      html  css  js  c++  java
  • __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 也是同一个对象 !
  • 相关阅读:
    机器学习第二次作业
    机器学习上机作业
    机器学习第一次作业
    软工实践个人总结
    第08组 Beta版本演示
    第08组 Beta冲刺(5/5)
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    第08组 Beta冲刺(1/5)
  • 原文地址:https://www.cnblogs.com/saolv/p/8981726.html
Copyright © 2011-2022 走看看