python_(:

>>> x = (x **2 for x in range(20))
>>> print(x)
 at 0xb7307aa4>
>>> x = list(x)
>>> print(x)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]

先看下object类中对new()方法的定义:

  class object: 
    @staticmethod 
    def __new__(cls, *more): # known special case of object.__new__ 
      """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ 
      pass 

object将new()方法定义为静态方法,并且至少需要传递一个参数cls,cls表示需要实例化的类,此参数在实例化时由Python解释器自动提供。

我们来看下下面类中对new()方法的实现:

  class Demo(object): 
    def __init__(self): 
      print '__init__() called...' 
    def __new__(cls, *args, **kwargs): 
      print '__new__() - {cls}'.format(cls=cls) 
      return object.__new__(cls, *args, **kwargs) 
  if __name__ == '__main__': 
    de = Demo() 

输出:

  __new__() - <class '__main__.Demo'> 
  __init__() called... 

发现实例化对象的时候,调用init()初始化之前,先调用了new()方法
new()必须要有返回值,返回实例化出来的实例,需要注意的是,可以return父类new()出来的实例,也可以直接将object的new()出来的实例返回。
init()有一个参数self,该self参数就是new()返回的实例,init()在new()的基础上可以完成一些其它初始化的动作,init()不需要返回值。
new()没有正确返回当前类cls的实例,那init()将不会被调用,即使是父类的实例也不行。
我们可以将类比作制造商,new()方法就是前期的原材料购买环节,init()方法就是在有原材料的基础上,加工,初始化商品环节。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,857评论 0 9
  • 小A同学失恋了,其实她失去的只不过是一个每天对她打骂,还恬不知耻问她要钱的渣男而已,而这家伙却不知施了什么魔法,让...
    小野猪的inbox阅读 423评论 0 2
  • 阶段考完,我上课放电影,有学生问我:老师,我考了多少分?我说,这个重要么?他说,这个不重要?我笑笑不语。我知道,他...
    老资情调阅读 325评论 2 1
  • 今天教学《圆的周长》,理顺课本制订教学步骤1.观察信息窗你知道了哪些数学信息?2.根据信息你能提出什么数学问题?3...
    心之山水阅读 1,090评论 0 1
  • 由于香格里拉路途遥远,原本的行程为此安排了三天,没有专门留出时间在古城内逛,但实在没想好怎么更改计划,决定今天哪儿...
    麋一样的鹿阅读 249评论 0 0