“__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中文網其他相關文章!