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