首頁  >  問答  >  主體

【python小白】 問關於__new__方法的作用的問題

程式碼A:

#
# -*- coding:gb2312 -*-
class Dog (object):
    def __init__(self):
        print("-----init方法-----")
    def __del__(self):
        print("-----del方法-----")
    def __str__(self):
        #print("-----str方法-----")
        return ("-----str方法-----")
    def __new__(cls):
        print("-----new方法-----")
        #return object.__new__(cls)
        
xtq = Dog()

程式碼A運行結果:

程式碼B:

#
# -*- coding:gb2312 -*-
class Dog (object):
    def __init__(self):
        print("-----init方法-----")
    def __del__(self):
        print("-----del方法-----")
    def __str__(self):
        #print("-----str方法-----")
        return ("-----str方法-----")
    def __new__(cls):
        print("-----new方法-----")
        object.__new__(cls)
        
xtq = Dog()

程式碼B運行結果:

程式碼C:

#
# -*- coding:gb2312 -*-
class Dog (object):
    def __init__(self):
        print("-----init方法-----")
    def __del__(self):
        print("-----del方法-----")
    def __str__(self):
        #print("-----str方法-----")
        return ("-----str方法-----")
    def __new__(cls):
        print("-----new方法-----")
        return object.__new__(cls)
        
xtq = Dog()

程式碼C運行結果:

##我的問題一:
這三段程式碼A,B,C為什麼輸出的結果都不一樣,原理在於哪裡呢?特別是代碼B和代碼C,為什麼代碼C這一段,在B的基礎上加上了return,結果就比B多了一個init方法。
我的問題二:
在給方法傳參數的時候self和cls 這兩個參數有啥差別?為什麼__new__這個方法要的參數是cls而__init__方法要傳入的參數是self?

phpcn_u1582phpcn_u15822670 天前594

全部回覆(1)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-28 09:26:55

    首先得先明白一件事情: selfcls的區別, cls是代表這個類, slef是用來代表這個類的實例,

    slef

    是用來代表這個類別的例子,了一點.

    函數參數帶有

    self的, 可以理解成這個函數, 是實例的方法, 是要和實例綁定的. __new__方法, 是新式類別用來創建實例使用的, 傳入的cls就是用來給object.__new__創建實例使用的參數, 如果沒有傳入cls

    ,

    創建實例使用的參數, 如果沒有傳入

    cls
      ,
    1. 知道創建什麼樣的實例.

      結合上面, 現在再來說下三個輸出不同的原因: 為什麼只有--new, 因為每個類別在實例化物件時, 都必須要呼叫這個__new__

      方法, 去建立實例, 所以它肯定會被呼叫, 但是因為該函數被你重寫了, 所以它只是打印了
    2. --new方法
    3. , 並沒有返回創建實例, 並且放回, 所以

      __del__也是不會發生

      為什麼只有--new和--del, 正如第1點所說的那樣, 但是這裡確實
    4. __new___
    5. 有創建新實例, 但是並沒有返回, 因為只有返回了, 該對象才能進行下一步的

      __init__

      , 正因為這裡只有創建, 沒有回傳, 所以結果這樣

    如果看懂前兩點, 相信這個應該沒啥問題, 因為創建了,並且返回了, 所以'__init__'也同樣被執行了, 所有的東西都是像正常的行為那樣發生 最後想說明: 為什麼__del__會被執行, 理論上, 這個只有在實例被del

    析構時, 才會執行,這裡並沒有🎜del xtq🎜類似的代碼, 為什麼也會執行, 原因就是, 程序結束了, 要退出了, 在執行更底層的程序退出時, 🎜python🎜自發做的內存回收, 所以一切塵歸塵土歸土, 創建的對像也被一一析構🎜

    回覆
    0
  • 取消回覆