先看下object類中對__new__()方法的定義:
class object:
@staticmethod # known case of __new__
def __n程式設計客棧ew__(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...'
de程式設計客棧f __new__(cls, *args, **kwargs):
print '__new__() - '.format(cls=cls)
return object.__new__(cls, *args, **kwargs)
if __name__ == '__main__':
de = demo()
輸出:__new__() -
__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__www.cppcns.com(cls, response, parser=etree.htmlparser):
cache = cls.cache.setdefault(response, {})
if parser not in cache:
obj www.cppcns.com= object_ref.__new__(cls)
cache[parser] = _factory(response, 程式設計客棧parser)
return cache[parser]
該類中的__new__()方法的使用,就是再進行初始化之前,檢查快取中是否存在該物件,如果存在則將快取存放物件直接返回,如果不存在,則將物件放至快取中,供下次使用。
本文標題: 詳解python中的__new__()方法的使用
本文位址:
詳解python中的 new
python中的 new 方法的使用 一丶object類中對 new 方法的定義 class object staticmethod known case of new def new cls,more known special case of object.new t.new s,a new o...
詳解Python中的 init 和 new
一 init 方法是什麼?使用python寫過物件導向的 的同學,可能對 init 方法已經非常熟悉了,init 方法通常用在初始化乙個類例項的時候。例如 複製 如下 coding utf 8 class person object silly person def init self,name,a...
詳解Python中的 init 和 new
使用python寫過物件導向的 的同學,可能對 init 方法已經非常熟悉了,init 方法通常用在初始化乙個類例項的時候。例如 coding utf 8 class person object silly person def init self,name,age self.name name s...