首頁 >後端開發 >Python教學 >為什麼在Python的物件建立中`__init__()`總是在`__new__()`之後呼叫?

為什麼在Python的物件建立中`__init__()`總是在`__new__()`之後呼叫?

DDD
DDD原創
2024-12-19 15:47:11477瀏覽

Why is `__init__()` Always Called After `__new__()` in Python's Object Creation?

“__init__()”和“__new__()”:順序和目的

“__init__()”和“__new__()”是Python物件導向程式設計中的基本方法,用於控制實例建立和初始化。

「__new__()」負責分配記憶體並建立類別的新實例,傳回新建立的物件。它負責實例的實際創建。

相反,「__init__()」初始化新建立的實例。它負責設定實例的屬性並執行任何必要的操作來準備物件以供使用。

Python 的設計規定,在實例建立過程中,總是在「__new__()」之後呼叫「__init__()」 。這是因為新實例在建立後需要初始化。

享元模式和「__init__()」呼叫

在享元模式的上下文中,您可能會對在「__new__()」之後呼叫「__init__ ()」的預期行為感到困惑。這是因為享元模式通常利用「__new__()」來控制實例建立並避免建立相同物件的多個副本。

在範例程式碼中,您已經實作了一個自訂的「__new__()」方法來根據字典中鍵的存在來處理實例建立。但是,您可能希望僅呼叫「__init__()」方法一次,即使對於使用享元模式建立的後續實例也是如此。

為什麼“__init__()”總是在“之後調用” __new__()"?

這種行為的原因是Python的物件導向系統期望創建的每個實例都透過呼叫來初始化「__init __()」。這是實例建立過程的基本部分,確保物件完全準備好使用。

替代實作

實作享元模式並避免呼叫「 __init__()" 多次,您應該使用工廠類別而不是覆蓋"__new__()"。這被認為是一種更穩健和標準的方法。

這是一個基於工廠的享元實現的範例:

class FlyweightFactory:
    _cache = {}

    def __get(key):
        if key not in FlyweightFactory._cache:
            FlyweightFactory._cache[key] = Flyweight(key)
        return FlyweightFactory._cache[key]

class Flyweight:
    def __init__(self, key):
        self.key = key

在此實作中,工廠類別基於關鍵,避免需要多次「__init__()」呼叫。

以上是為什麼在Python的物件建立中`__init__()`總是在`__new__()`之後呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn