python中__init__方法、__new__方法、__str__方法、__del__方法、__call__方法詳解

一、 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__方法就能幫你實現。

發佈了32 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章