>>> 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類中對(duì)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()方法定義為靜態(tài)方法,并且至少需要傳遞一個(gè)參數(shù)cls,cls表示需要實(shí)例化的類纪吮,此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)提供。
我們來看下下面類中對(duì)new()方法的實(shí)現(xiàn):
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...
發(fā)現(xiàn)實(shí)例化對(duì)象的時(shí)候,調(diào)用init()初始化之前来破,先調(diào)用了new()方法
new()必須要有返回值,返回實(shí)例化出來的實(shí)例忘古,需要注意的是徘禁,可以return父類new()出來的實(shí)例,也可以直接將object的new()出來的實(shí)例返回髓堪。
init()有一個(gè)參數(shù)self送朱,該self參數(shù)就是new()返回的實(shí)例,init()在new()的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作干旁,init()不需要返回值驶沼。
若new()沒有正確返回當(dāng)前類cls的實(shí)例,那init()將不會(huì)被調(diào)用争群,即使是父類的實(shí)例也不行回怜。
我們可以將類比作制造商,new()方法就是前期的原材料購買環(huán)節(jié)换薄,init()方法就是在有原材料的基礎(chǔ)上玉雾,加工,初始化商品環(huán)節(jié)专控。