眾所周知,python中定義的類在創建實例對象的時候,會自動執行__init__()方法,但是在執行__init__()方法之前,會執行__new__()方法。
__new__()的作用主要有兩個。
1.在內存中為對象分配空間
2.返回對象的引用。(即對象的內存地址)
python解釋器在獲得引用的時候會將其傳遞給__init__()方法中的self。
def A(object): def __new__(cls,*args,**kwargs): print('古明地覺') return super().__new__(cls)#這里一定要返回,否則__init__()方法不會被執行 def __init__(self):#這里的self就是new方法中的return返回值 print('芙蘭朵露斯卡雷特') #輸出結果 古明地覺 芙蘭朵露斯卡雷特
那么new有什么作用呢?我們可以改寫它,舉個例子,就比如說單例模式。
如果我們創建兩個實例:
a1 = A()
a2 = A()
那么id(a1)和id(a2)的值不一樣,也就是說python在內容當中創建了兩個實例對象,用了兩份內存。同樣的東西創建了兩份
如果想不管創建多少個實例對象,我們都讓它的id是一樣的。
也就是說,先創建一個實例對象,之后不管創建多少個,返回的永遠都是第一個實例對象的內存地址。
def A(object): _instance = None def __new__(cls,*args,**kwargs): if A._instance == None: A._instance = super().__new__(cls) return A._instance #重寫new方法很固定,返回值必須是這個 #這樣就避免了創建多份。 #創建第一個實例的時候,_instance是None,那么會分配空間創建實例。 #此時的類屬性已經被修改,_instance不再為None #那么當之后實例屬性被創建的時候,由於_instance不為None。 #則返回第一個實例對象的引用,即內存地址。 #這樣就應用了單例模式。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。