python面向對象之__new__方法


眾所周知,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。
#則返回第一個實例對象的引用,即內存地址。
#這樣就應用了單例模式。

  


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com