Python 中__new__()和__init__()的區別


轉自: https://blog.csdn.net/weixin_37579123/article/details/89515577

__new__方法:類級別的方法

特性:
1.是在類准備將自身實例化時調用,並且至少需要傳遞一個參數cls,此參數在實例化時由python解釋器自動提供;

2.始終是類的靜態方法,即使沒有被加上靜態方法裝飾器;

3.必須要有返回值,返回實例化出來的實例;在自己實現__new__()時需要注意:可以return父類(通過super(當前類名,cls)).__new__出來的實例,
或者直接是object的__new__出來的實例

class A(object):
    pass
 
a=A()       # 默認調用父類object的__new__()方法來構造該類的實例
print (a)   # 返回的是<__main__.A object at 0x0000024352732630>
class A(object):
 
    def __new__(cls):
        "重寫__new__方法"
        return "abc"
 
a=A()
print (a)        # 'abc',實例化對象取決於__new__方法,__new__返回什么就是什么
print (type(a))  # <class 'str'>
通過__new__()方法實現單例
 
class Singleton(object):
 
    def __new__(cls,*args,**kwargs):
        if not hasattr(cls,"_instance"):
            cls._instance=super(Singleton,cls).__new__(cls)
        return cls._instance
 
a=Singleton()
b=Singleton()
c=Singleton()
print (a)
print (b)
print (c)
 
輸出結果:
<__main__.Singleton object at 0x000002474C92D550>
<__main__.Singleton object at 0x000002474C92D550>
<__main__.Singleton object at 0x000002474C92D550>

__init__方法:實例級別的方法

特性:
1.有一個參數self,該self參數就是__new__()返回的實例;

2.__init__()在__new()的基礎上完成初始化動作,不需要返回值;

3.若__new__()沒有正確返回當前類cls的實例,那__init__()將不會被調用

4.創建的每個實例都有自己的屬性,方便類中的實例方法調用;

 

對比下面代碼理解會更加清晰:

class B():
    def __new__(cls):
        print ("__new__方法被執行")
 
    def __init__(self):
        print ("__init__方法被執行")
 
b=B()   
結果:
__new__方法被執行
class B():
    def __new__(cls):
        print ("__new__方法被執行")
        return super(B,cls).__new__(cls)
 
    def __init__(self):
        print ("__init__方法被執行")
 
b=B()
結果:
__new__方法被執行
__init__方法被執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM