Python new 關鍵字

Aditya Raj 2023年1月30日 2022年5月17日
  1. Python 中的 new 關鍵字是什麼
  2. 在 Python 中如何使用 new 關鍵字
  3. 我們如何顯式實現 __new__() 方法
  4. まとめ
Python new 關鍵字

在 C++ 和 Java 等程式語言中,你可以顯式使用 new 關鍵字從類建立物件。但是,你不能直接在 Python 中使用 new 關鍵字。在本文中,我們將討論 new 關鍵字在 Python 中的工作原理。我們還將看到如何顯式地使用 new 關鍵字來觀察 Python 中物件建立的過程。

Python 中的 new 關鍵字是什麼

在 Python 中,__new__ 是與物件關聯的屬性。你可以使用 dir() 函式檢查物件的所有屬性。dir() 函式將物件作為輸入並返回所有物件屬性的列表,如下所示。

class Car:
    def __init__(self, model, brand, price, country):
        self.Brand = brand
        self.Model = model
        self.Price = price
        self.Country = country


myCar = Car("Tesla", "Cybertruck", 40000, "USA")
print(dir(myCar))

輸出:

['Brand', 'Country', 'Model', 'Price', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

你可以觀察到列表中存在一個 __new__ 屬性。

在 Python 中如何使用 new 關鍵字

我們不能像在其他程式語言中那樣顯式地在 Python 中使用 new 關鍵字。但是,Python 中的 __new__ 屬性與其他程式語言中的 new 關鍵字的作用相同。__new__() 方法在基類object中定義,用於為物件分配儲存空間。

當我們通過使用語法 className() 呼叫類名來建立一個新物件時,會執行該類的 __call__() 方法。__call__() 方法呼叫 __new__() 方法。在這裡,__new__() 方法為物件分配記憶體並將控制權返回給 __call__() 方法。

__call__() 方法然後呼叫 __init__() 方法。__init__() 方法初始化類變數並將控制權返回給 __call__() 方法。__call__() 方法然後完成執行並將對建立的物件的引用返回給我們。

我們如何顯式實現 __new__() 方法

我們不需要在 Python 中顯式實現 __new__() 方法。但是,如果你想檢視 __new__() 方法和 __init__() 方法的執行順序,我們可以覆蓋 __new__() 方法。正如我們在上面看到的,__new__() 方法是一個靜態方法,並在物件類中定義。當我們使用類名建立一個物件時,它的 __new__() 方法會被自動呼叫。

__new__() 方法接受一個代表當前類的輸入引數 cls。然後 __new__() 方法使用當前類作為輸入引數呼叫其超類的 __new__() 方法。這個過程需要繼續,直到我們到達基類 object。在基類 object 中,執行 __new__() 方法,併為我們要建立的物件分配儲存空間。然後,建立物件的例項。__new__() 方法然後返回例項,之後 __init__() 方法用於初始化例項中的變數。

你可以在以下示例中觀察整個過程。

class Car:
    def __init__(self, brand, model, price, country):
        print("I am in the __init__() method.")
        self.Brand = brand
        self.Model = model
        self.Price = price
        self.Country = country

    def __new__(cls, *args, **kwargs):
        print("I am in the __new__() method.")
        return super(Car, cls).__new__(cls)


myCar = Car("Tesla", "Cybertruck", 40000, "USA")

輸出:

I am in the __new__() method.
I am in the __init__() method.

這裡,我們實現的 __new__() 方法屬於當前類,它不會影響任何物件例項的建立方式。為了改變它,我們需要改變基類 object 中的 __new__() 方法。但是,我們不允許這樣做,你不應該嘗試進行任何此類實驗。此外,你可以在輸出中驗證 __new__() 方法在 __init__() 方法之前執行。

まとめ

我們在本文中討論了 Python 中的 new 關鍵字。我們還看到了如何使用 dir() 方法獲取與類關聯的所有屬性。此外,我們還看到了如何在 Python 中建立物件以及 __new__() 方法是如何工作的。我們還自己實現了 __new__() 方法。但是,它不是很有用,我建議你不要自己實現 __new__() 方法。

相關文章 - Python Class