一、 python的__init__方法和__new__方法
該方法是python中初始化的方法,也稱構造方法。但是它與其他語言中的構造方法不同,它只進行初始化。__new__方法是創建對象的方法。其中具體的細節看下面代碼詳解。
可以看到定義了一個初始化函數,在創建對象時就被執行了。
class Cat(object):
def __init__(self):
print("這是__init__方法")
創建對象
cat=Cat()
輸出結果:這是__init__方法
下面給它添加一個__new__函數請看。
class Cat(object):
def __init__(self):
print("這是__init__方法")
def __new__(cls):
print("這是__new__方法")
繼續創建對象對__init__方法進行調用
cat=Cat()
輸出結果:這是__new__方法
現在發現函數並沒有執行__init__方法,這是因爲object類是所有類的基類,在創建對象時都要調用基類中的__new__方法,這裏相當於把父類的__new__方法進行了複寫。要想它繼續執行__init__方法,就要返回父類__new__方法創建出來對象的引用。下面進行修改
class Cat(object):
def __init__(self):
print("這是__init__方法")
def __new__(cls):
print("這是__new__方法")
return object.__new__(cls)
創建對象繼續調用
cat=Cat()
輸出結果:這是__new__方法
這是__init__方法
現在發現__init__方法被調用了。所以可以看出__init__方法只是做了初始化,而正真創建對象的是__new__方法。
下面對代碼進行詳細的解釋
class Cat(object):
def __init__(self):
"""
self:參數來接受剛剛創建的對象cat的引用
"""
print("這是__init__方法")
def __new__(cls):
"""
參數:cls是Cat類指向的對象,也就是cat
:return:返回值是cat對象的引用:
print(object.__new__(cls))的結果
<__main__.Cat object at 0x0000027224657A58>
"""
return object.__new__(cls)
補充內容: 這裏根據__new__方法的創建過程,可以創建單例模式。 單例模式:不管怎麼創建只有一個對象,如我們使用的微信界面、QQ界面,你每次打開的時候只有一個主界面。這樣的模式就是單例模式。下面用代碼說明其中的細節
class Cat(object):
#控制創建對象的數量
__instance=None
def __init__(self,name):
"""
self:參數來接受剛剛創建的對象cat的引用
"""
self.name=name
def __new__(cls,name):
"""
參數:cls是Cat類指向的對象,也就是cat
:return:返回值是cat對象的引用:<__main__.Cat object at 0x0000027224657A58>
"""
if cls.__instance==None:
cls.__instance=object.__new__(cls)
print("第一次................")
return Cat.__instance
else:
print("第二次對象指向了第一次創建的那個對象................")
return Cat.__instance
cat1=Cat("白貓")
print(cat1.name)
cat2=Cat("黑貓")
print(cat2.name)
cat3=Cat("波斯貓")
print(cat3.name)
輸出結果:
第一次................
白貓
第二次對象指向了第一次創建的那個對象................
黑貓
第二次對象指向了第一次創建的那個對象................
波斯貓
上面可以看到,我創建了三個對象,但是第二個對象和第三個對象都指向了第一次創建的那個對象,現在可以看到每次都將不同的對象name打印出來。也就是對象初始化了三次,現在讓對象只初始化一次。也就是說只要有一個對象被創建出來了,就不需要其他對象名字進行初始化。
class Cat(object):
#控制創建對象的數量
__instance=None
#定義參數判斷對象是否是第一次初始化,如果第一次初始化則爲false,否在爲True
__Flag=False
def __init__(self,name):
"""
self:參數來接受剛剛創建的對象cat的引用
"""
if Cat.__Flag==False:
self.name=name
Cat.__Flag=True
def __new__(cls,name):
"""
參數:cls是Cat類指向的對象,也就是cat
:return:返回值是cat對象的引用:<__main__.Cat object at 0x0000027224657A58>
"""
if cls.__instance==None:
cls.__instance=object.__new__(cls)
print("第一次................")
return Cat.__instance
else:
print("第二次對象指向了第一次創建的那個對象................")
return Cat.__instance
cat1=Cat("白貓")
print(cat1.name)
cat2=Cat("黑貓")
print(cat2.name)
cat3=Cat("波斯貓")
print(cat3.name)
輸出結果:
第一次................
白貓
第二次對象指向了第一次創建的那個對象................
白貓
第二次對象指向了第一次創建的那個對象................
白貓
這裏可以看出無論創建幾個對象,它都只有一個對象被創建出來,並且只初始化了一次。
上述單例模式是__new__方法的最好體現。
二、python的__str__方法和__del__方法
__str__獲取對象的描述信息時自動調用,也即用print(對象名)時輸出__str__的信息。
class Cat(object):
def __init__(self,name):
self.name=name
def __str__(self):
return "這是一隻%s"%self.name
cat1=Cat("白貓")
print(cat1)
cat2=Cat("黑貓")
print(cat2)
輸出結果:
這是一隻白貓
這是一隻黑貓
現在將對象cat1賦值給cat2再來看看:
cat1=Cat("白貓")
cat2=cat1
print("cat1",cat1)
print("cat2",cat2)~
輸出結果:
cat1 這是一隻白貓
cat2 這是一隻白貓
可以看出,將cat1的地址給了cat2,所以現在可以理解爲,一個對象有兩個名字,我們使用del方法將其刪除一個,del刪除時會調用__del__方法,__del__方法在程序結束和對象死掉的時候會自動執行。 del 用於銷燬 Python 對象,即在任何 Python 對象將要被系統回收之時,系統都會自動調用該對象的 __del__方法,下面用代碼說明其中的細節
class Cat(object):
def __init__(self,name):
self.name=name
def __del__(self):
print("執行__del__方法")
cat1=Cat("白貓")
cat2=cat1
del cat1
# del cat2
print("======程序結束======")~
運行結果:
======程序結束======
**執行__del__方法**
現在有兩個對象cat1和cat2,如果只刪除一個對象cat1那麼創建的對象只有在程序完全結束的時候才調用__del__方法進行刪除,當用del將兩對象都刪除時,此時創建的對象也被銷燬,所以對象死亡的時候就會調用__del__方法 。輸出結果如下:
*執行__del__方法
======程序結束======*
上面也可以看到,del方法刪除對象時,只是刪除其中一個對象的引用,並不是真正的刪除了對象,只有當所有的對象引用都被刪除時,對象纔會被正真刪除。
三、python的__call__方法
首先__call__方法的作用是將創建的實例對象可以當方法用,也就是能夠給創建的實例對象穿參數。下面具體看代碼
class Cat(object):
def __call__(self,temp):
return temp**2
cat1=Cat()
print(cat1(2))
輸出結果:4
這個例子可以 看出將對象作爲了方法來給它傳參數進行計算。換句話,以後要想將對象作爲方法,那麼__call__方法就能幫你實現。