国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python中的__new__()方法的使用

2019-11-25 17:47:13
字體:
來源:轉載
供稿:網友

先看下object類中對__new__()方法的定義:

  class object:     @staticmethod # known case of __new__     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__()方法就是在有原材料的基礎上,加工,初始化商品環節。

實際應用過程中,我們可以這么使用:

  class LxmlDocument(object_ref):     cache = weakref.WeakKeyDictionary()     __slots__ = ['__weakref__']     def __new__(cls, response, parser=etree.HTMLParser):       cache = cls.cache.setdefault(response, {})       if parser not in cache:         obj = object_ref.__new__(cls)         cache[parser] = _factory(response, parser)       return cache[parser] 


該類中的__new__()方法的使用,就是再進行初始化之前,檢查緩存中是否存在該對象,如果存在則將緩存存放對象直接返回,如果不存在,則將對象放至緩存中,供下次使用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤翔县| 合作市| 柳江县| 旬阳县| 循化| 岳池县| 长宁县| 上饶市| 古浪县| 安福县| 青河县| 重庆市| 循化| 阳谷县| 手游| 射阳县| 辽宁省| 建阳市| 正镶白旗| 延寿县| 阿克| 石首市| 水城县| 宁德市| 古丈县| 金湖县| 南宁市| 花莲市| 旌德县| 石家庄市| 桂林市| 孟州市| 弋阳县| 兴安盟| 浦东新区| 栾城县| 公安县| 长武县| 社会| 虞城县| 芦溪县|