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

為什麼Python的`__init__()`總是在`__new__()`之後呼叫?

Patricia Arquette
發布: 2024-12-18 17:36:10
原創
586 人瀏覽過

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

理解__init__() 和__new__() 的順序

在Python 中, __new__() 和__init__() 方法起著至關重要的作用在實例創建過程中。然而,許多開發人員想知道為什麼 __init__() 總是在 __new__() 之後呼叫。

__new__() 的用途

__new__() 負責控制 __new__() 的建立一個新實例。它初始化實例的分配並傳回實例本身。本質上,__new__() 決定是建立新實例還是重複使用現有實例。

__init__()

__init__() 的用途用於物件初始化。它設定實例的屬性並運行任何必要的設定代碼。 __init__() 不會回傳任何內容,因為它的主要目的是初始化物件的狀態。

實例建立中的順序

實例建立中的順序總是:

  1. 首先呼叫__new__() 來分配並可能傳回現有的
  2. 如果__new__() 傳回一個新實例,則呼叫__init__()來初始化該實例。

範例

下面的例子說明了 __new__()如何控制實例建立:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class A(object):

    _dict = dict()

 

    def __new__(cls):

        if 'key' in A._dict:

            print("EXISTS")

            return A._dict['key']

        else:

            print("NEW")

            return super(A, cls).__new__(cls)

 

    def __init__(self):

        print("INIT")

        A._dict['key'] = self

        print("")

 

a1 = A()

a2 = A()

a3 = A()

登入後複製

輸出:

1

2

3

4

5

6

7

8

NEW

INIT

 

EXISTS

INIT

 

EXISTS

INIT

登入後複製

如您所見,__new__() 首先檢查 _dict 中是否已存在實例。如果是,則傳回該現有實例。否則,它會建立一個新實例並傳回它。然後呼叫 __init__() 來初始化每個實例。

使用 __new__() 的替代方案

大多數情況下,使用 __new__() 來實現您自己的享元設計模式不建議。相反,請考慮使用工廠類別或物件池來管理實例的建立和重複使用。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板