程式碼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?
过去多啦不再A梦2017-06-28 09:26:55
首先得先明白一件事情: self
和cls
的區別, cls
是代表這個類
, slef
是用來代表這個類的實例
,
是用來代表這個類別的例子,了一點.
self的, 可以理解成這個函數, 是實例的方法, 是要和實例綁定的.
__new__
方法, 是新式類別用來創建實例使用的, 傳入的
cls就是用來給
object.__new__創建實例使用的參數, 如果沒有傳入
cls
創建實例使用的參數, 如果沒有傳入
cls
結合上面, 現在再來說下三個輸出不同的原因:
為什麼只有--new, 因為每個類別在實例化物件時, 都必須要呼叫這個
__new__
__del__也是不會發生
__init__
, 正因為這裡只有創建, 沒有回傳, 所以結果這樣如果看懂前兩點, 相信這個應該沒啥問題, 因為創建了,並且返回了, 所以'__init__'也同樣被執行了, 所有的東西都是像正常的行為那樣發生
最後想說明: 為什麼
__del__會被執行, 理論上, 這個只有在實例被
del